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