首頁 >後端開發 >Golang >為什麼在具有匿名函數的 For 循環中啟動的 Go Goroutines 都列印相同的值?

為什麼在具有匿名函數的 For 循環中啟動的 Go Goroutines 都列印相同的值?

Linda Hamilton
Linda Hamilton原創
2024-11-23 18:22:17403瀏覽

Why Do Go Goroutines Launched in a For Loop with Anonymous Functions All Print the Same Value?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn