为了账号安全,请及时绑定邮箱和手机立即绑定

去如何正确使用 for ... range 循环

去如何正确使用 for ... range 循环

Go
PIPIONE 2021-12-06 19:37:09
目前我有一个包含以下代码的 go 程序。package mainimport "time"import "minions/minion"func main() {    // creating the slice    ms := make([]*minion.Minion, 2)    //populating the slice and make the elements start doing something    for i := range ms  {        m := &ms[i]        *m = minion.NewMinion()        (*m).Start()    }    // wait while the minions do all the work    time.Sleep(time.Millisecond * 500)    // make the elements of the slice stop with what they were doing    for i := range ms {        m := &ms[i]        (*m).Stop()    }}这NewMinion()是一个构造函数,它返回一个*minion.Minion代码运行良好,但在m := &ms[i]我每次使用for ... range循环时都必须编写,在我看来应该有一种代码编写者更友好的方法来解决这个问题。理想情况下,我希望以下内容成为可能(使用合成的 &range 标签):package mainimport "time"import "minions/minion"func main() {    // creating the slice    ms := make([]*minion.Minion, 2)    //populating the slice and make the elements start doing something    for _, m := &range ms  {        *m = minion.NewMinion()        (*m).Start()    }    // wait while the minions do all the work    time.Sleep(time.Millisecond * 500)    // make the elements of the slice stop with what they were doing    for _, m := &range ms {        (*m).Stop()    }}不幸的是,这还不是语言功能。关于m := &ms[i]从代码中删除 的最好方法有什么考虑吗?或者有没有比这更省力的写法?
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您的第一个示例是一个指针切片,您不需要每次都获取切片中指针的地址然后取消引用这些指针。更惯用的 Go 看起来像(稍微编辑以在没有“minion”包的情况下在操场上运行):


http://play.golang.org/p/88WsCVonaL


// creating the slice

ms := make([]*Minion, 2)


//populating the slice and make the elements start doing something

for i := range ms {

    ms[i] = NewMinion(i)

    ms[i].Start()


    // (or equivalently) 

    // m := MewMinion(i)

    // m.Start()

    // ms[i] = m

}


// wait while the minions do all the work

time.Sleep(time.Millisecond * 500)


// make the elements of the slice stop with what they were doing

for _, m := range ms {

    m.Stop()

}


查看完整回答
反对 回复 2021-12-06
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

这都是错误的。


绝对不需要在代码中获取指针的地址。ms是一个指针切片,您的构造函数返回一个指针,因此只需直接分配 i :


for i := range ms  {

    ms[i] = minion.NewMinion()

    ms[i].Start()

}

死的简单。


查看完整回答
反对 回复 2021-12-06
  • 2 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信