首頁 >後端開發 >Golang >為什麼 Go 中的 Goroutines 在共享變數時會列印不同的值?

為什麼 Go 中的 Goroutines 在共享變數時會列印不同的值?

Patricia Arquette
Patricia Arquette原創
2024-11-05 19:23:02740瀏覽

Why Do Goroutines Print Different Values When Sharing Variables in Go?

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(&amp;x)
        }()
    }
    wg.Wait()
    fmt.Println("Done")
}

答案:

在第一個片段中,每個goroutine 都有變數x 的新實例。這是因為 x := i 在每次循環迭代時都會建立一個新變數。 為了示範這一點,我們可以在每個 goroutine 中列印 x 的記憶體位址:運行此程式碼將為每個 goroutine 顯示不同的記憶體位址。 在第二個片段中,變數 i 在傳遞給 go func() 的匿名函數中直接引用。這意味著所有 goroutine 共享相同的 i 值,這導致了統一的輸出。

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

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