目前我有一个包含以下代码的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]
?或者是否还没有比这更省力的工作呢?
答案 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()
}
死了简单。