作为 goroutines 启动的 3 个不同的 func 产生相同的 goroutine

对于 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 程序,我确定我遗漏了一些明显的东西。有任何想法吗?


谢谢你。


慕尼黑5688855
浏览 184回答 1
1回答

天涯尽头无女友

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()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go