首頁 > 後端開發 > Golang > 主體

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

藏色散人
發布: 2021-04-12 11:27:49
轉載
2533 人瀏覽過

下面由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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板