在循环中使用带有 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 访问。