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

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

Patricia Arquette
發布: 2024-11-05 19:23:02
原創
741 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板