在循环中使用带有 goroutine 的闭包
在循环中,以下示例中的循环变量(val)是单个变量,它在循环时更改值。因此,必须执行以下操作才能将每个值的 val 实际传递给 goroutine:
for val := range values {
go func(val interface{}) {
fmt.Println(val)
}(val)
}
如果你只是去做 func(val interface{}) { ... }()
而不通过 val,那么 val
的值将是 goroutines 实际运行时的 val 值。
获得相同效果的另一种方法是:
for val := range values {
val := val
go func() {
fmt.Println(val)
}()
}
奇怪的 val := val
在每次迭代中创建一个新变量,然后由 goroutine 访问。