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,但您似乎忘记使用它。