作为goroutine启动的3个不同func生成相同的goroutine(显然忽略参数)

作为goroutine启动的3个不同func生成相同的goroutine(显然忽略参数),go,concurrency,goroutine,Go,Concurrency,Goroutine,对于3个不同且不同的“c” …启动3个相同的goroutine,其中c.name和c.channel是相同的 长版本(注释,短代码): 这是我的第一个围棋项目,我肯定我错过了一些明显的东西。有什么想法吗 谢谢。对c.Listen()的调用正在接近c的值,该值通过指向Listen的指针传递,每次迭代都会更改该值。如果将方法调用视为方法表达式,则更容易可视化 go (*component).Listen(&c) 在每次迭代中为c创建一个新值,以防止覆盖以前的值: for _, c :=

对于3个不同且不同的“c”

…启动3个相同的goroutine,其中c.name和c.channel是相同的

长版本(注释,短代码):

这是我的第一个围棋项目,我肯定我错过了一些明显的东西。有什么想法吗

谢谢。

c.Listen()
的调用正在接近c的值,该值通过指向
Listen
的指针传递,每次迭代都会更改该值。如果将方法调用视为方法表达式,则更容易可视化

go (*component).Listen(&c)

在每次迭代中为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()
}

感谢您的修复,尤其是解释。它现在可以正常工作了。
for i := range u.components {
    go u.components[i].Listen()
}