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

时间:2016-01-06 15:32:11

标签: for-loop go range slice

目前我有一个包含以下代码的go程序。

package main

import "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,在我看来应该有一个代码编写者更友好的方法来解决这个问题。

理想情况下,我希望能够使用以下内容(使用made up& range标签):

package main

import "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 个答案:

答案 0 :(得分: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()
}

答案 1 :(得分:0)

这都错了。

绝对不需要在代码中使用指针的地址。 ms是指针的一部分,你的构造函数返回一个指针,所以直接指定我:

for i := range ms  {
    ms[i] = minion.NewMinion()
    ms[i].Start()
}

死了简单。