Golang 中的Goroutines 如何共享變數
在學習Golang 的並發特性時,出現了一個有趣的問題:goroutines 如何共享變數?一個簡單的範例說明了細微差別的行為。
範例1
考慮以下程式碼:
<code class="go">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") }</code>
輸出:
<code class="text">4 0 1 3 2</code>
每個goroutine 都正確列印每個goroutine 都正確列印每個goroutine 都正確列印每個goroutine 都正確列印了預期的值。
範例2
現在,讓我們稍微修改一下程式碼:
<code class="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") }</code>
輸出:
<code class="text">5 5 5 5 5</code>
輸出:
說明這些範例的差異在於goroutine 捕捉變數x 的方式。在範例 1 中,每個 goroutine 中都會建立一個新的局部變數 x,讓它們可以存取正確的值。
然而,在範例 2 中,goroutine 捕捉了變數 i,這是一個循環變數。隨著循環迭代,i 被更新,導致所有 goroutine 在運行時引用相同的值。 這個差異凸顯了 Go 並發中變數作用域的重要性。為了避免競爭條件和不可預測的行為,必須在新的局部變數中捕捉預期值。以上是Golang中的Goroutine如何共享變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!