Go 並發與for 循環和匿名函數的意外行為
在Go 並發中,了解匿名函數啟動時的行為至關重要作為goroutine。這在嘗試使用sync.WaitGroup等待多個goroutines完成Amazon S3上傳時得到了證明。
初始程式碼使用for循環來啟動goroutines,但輸出令人驚訝地顯示所有goroutines列印相同的值( 6).發生這種情況是因為Goroutines 直到for 循環完成後才被調度,因此執行時i 的值為6。
程式碼被修改為將 i 作為參數傳遞給匿名函數,導致期望的行為。這是因為傳遞 i 會建立一個新變數並捕獲呼叫時的值。
此行為與 Go FAQ 一致,其中指出當匿名函數作為 goroutine 啟動時,它會捕獲狀態創建時的周圍變數。將 i 作為參數傳遞會有效複製當時的值。
因此,在 goroutine 中使用匿名函數時,考慮閉包行為並使用值傳遞等技術來實現所需的並發行為非常重要。
以上是為什麼在具有匿名函數的 For 循環中啟動的 Go Goroutines 都列印相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!