去兽医抱怨循环变量被 func 文字捕获

  • 本文关键字:func 文字 变量 循环 go
  • 更新时间 :
  • 英文 :


gogithub页面中记录的新手常见错误之一是忽略将循环变量作为参数传递给goroutine(其中程序的输出可能会显示意外结果:

for _, val := range values {
go func() {
/* here is where go-vet complains loop variable v captured by func literal*/
fmt.Println(val) 
}()
}
很有可能当你

运行这段代码时,你会看到 为每次迭代打印的最后一个元素,而不是 中的每个值 序列,因为 goroutines 可能不会开始执行 直到循环之后。

所以提出的解决方案是(如前所述(将实际的循环变量作为goroutine参数传递:

for _, val := range values {
go func(val interface{}) {
fmt.Println(val)
}(val)
}

那么go-vet在下面的例子中唠叨什么呢?

func main() {
ch := make(chan int)
for i := 0; i < 2; i++ {
go func(emp int) {
for range ch {
rcv := <-ch
/*  loop variable i captured by func literal */
fmt.Printf("employee %d received signal %dn", i, rcv)
}
}(i)
}
}

这是一行:

fmt.Printf("employee %d received signal %dn", i, rcv)

在这里,使用emp而不是i.您正在将循环变量作为emp传递给 goroutine,但您似乎忘记使用它。

最新更新