为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑5688855 2021-11-29 19:32:59
对于 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()

}


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信