首頁 >後端開發 >Golang >為什麼 Golang Goroutines 在共享變數時輸出相同的值?

為什麼 Golang Goroutines 在共享變數時輸出相同的值?

Linda Hamilton
Linda Hamilton原創
2024-11-06 06:24:02428瀏覽

Why do Golang Goroutines Output the Same Value When Sharing Variables?

Golang 如何並發共享變數

這次討論的重點是理解 Go 中多個 goroutine 之間如何共享變數。考慮以下程式碼:

<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>

執行後,得到預期輸出:

4
0
1
3
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>

結果輸出出乎意料一致:

5
5
5
5
5

解釋

關鍵差異在於Goroutine 中變數的作用域。

In在第一個程式碼片段中,循環的每次迭代都會建立一個新變數 x 並將其值傳遞給 goroutine。當 goroutine 執行時,它有 x 的本機副本並列印其初始值。這樣就得到了預期的輸出。

但是,在第二個程式碼片段中,所有 goroutine 共用一個變數 i。當 goroutine 執行時,它會在循環完成後檢索 i 的最終值。因此,所有 goroutine 都輸出相同的值,5。

影響和最佳實踐

這種行為凸顯了使用 goroutine 時變數範圍的至關重要性。為了確保執行緒安全執行,必須考慮變數的範圍並在必要時利用等待群組等同步原語(如兩個程式碼片段所示)。

以上是為什麼 Golang Goroutines 在共享變數時輸出相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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