在迴圈中使用帶有 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 訪問。