对于 3 个不同且不同的“c”for _, c := range u.components { // u.components has 3 members fmt.Printf("%v %v", c.name, c.channel) // prints 3 distinct name/channel pairs go c.Listen(); // a method of c that listens on channel c.channel}...启动 3 个相同的 goroutine,其中 c.name 和 c.channel 是相同的。长版(注释,短代码):https : //play.golang.org/p/mMQb_5jLjm这是我的第一个 Go 程序,我确定我遗漏了一些明显的东西。有任何想法吗?谢谢你。
1 回答
天涯尽头无女友
TA贡献1831条经验 获得超9个赞
c.Listen()对 c的调用正在关闭 c 的值,该值通过指向 的指针传递Listen,并且每次迭代都会更改该值。如果将方法调用视为方法表达式,则更容易形象化
go (*component).Listen(&c)
https://golang.org/doc/faq#closures_and_goroutines
在每次迭代时为 c 创建一个新值,以防止前一个被覆盖:
for _, c := range u.components { // u.components has 3 members
c := c
fmt.Printf("%v %v", c.name, c.channel) // prints 3 distinct name/channel pairs
go c.Listen(); // a method of c that listens on channel c.channel
}
或者直接使用切片中包含的值:
for i := range u.components {
go u.components[i].Listen()
}
- 1 回答
- 0 关注
- 183 浏览
添加回答
举报
0/150
提交
取消