首頁  >  文章  >  後端開發  >  分享一個go語言採坑:閉包共享變數問題

分享一個go語言採坑:閉包共享變數問題

藏色散人
藏色散人轉載
2021-04-12 11:27:362540瀏覽

下面由golang教學欄位給大家分享一個go語言採坑:閉包共享變數問題,希望對需要的朋友有幫助!

分享一個go語言採坑:閉包共享變數問題

文字不多說,直接看程式碼與註解:

package mainimport (
    "fmt"
    "time")func main() {
    // 错误示例(打印出的结果是5个6)
    fmt.Println("closure buggy example...")
    for i := 1; i <= 5; i++ {
        // 每个goroutine共享一个变量,goroutine还没开始的时候,i已经变成了6
        go func() {
            fmt.Println(i)
        }()
    }
    time.Sleep(1 * time.Second)


    // 正确示例1:
    fmt.Println("normal example...")
    for i := 1; i <= 5; i++ {
        go func(i int) {   // 使用局部变量
            fmt.Println(i)
        }(i)
    }
    time.Sleep(1 * time.Second)

    // 正确示例2:
    fmt.Println("normal example 2...")
    for i := 1; i <= 5; i++ {
        i := i  // 为每个闭包创建一个变量
        go func() {
            fmt.Println(i)
        }()
    }
    time.Sleep(1 * time.Second)}

運作得到的結果如下:

closure buggy example...66666normal example...52134normal example 2...52134

#>請參考程式碼註解。第一個例子是錯誤範例,第二、三個例子是正確範例。

以上是分享一個go語言採坑:閉包共享變數問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除