Go 中的Goroutine 共享變數行為
問題:
問題:package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) x := i go func() { defer wg.Done() fmt.Println(x) }() } wg.Wait() fmt.Println("Done") }在探索Go 的並發>在探索Go 的並發>
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(i) }() } wg.Wait() fmt.Println("Done") }
在探索Go 的並發>特性時,開發人員在goroutine 之間共用變數時會遇到意外行為。在某些程式碼修改的情況下,輸出完全不同。 在下面的程式碼片段中,每個goroutine 正確列印其對應的x 值:
但是,對程式碼為所有goroutine 產生統一的結果:但是,對程式碼為所有goroutine 產生統一的結果:package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) x := i go func() { defer wg.Done() fmt.Println(&x) }() } wg.Wait() fmt.Println("Done") }
答案:
在第一個片段中,每個goroutine 都有變數x 的新實例。這是因為 x := i 在每次循環迭代時都會建立一個新變數。 為了示範這一點,我們可以在每個 goroutine 中列印 x 的記憶體位址:運行此程式碼將為每個 goroutine 顯示不同的記憶體位址。 在第二個片段中,變數 i 在傳遞給 go func() 的匿名函數中直接引用。這意味著所有 goroutine 共享相同的 i 值,這導致了統一的輸出。以上是為什麼 Go 中的 Goroutines 在共享變數時會列印不同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!