ホームページ >バックエンド開発 >Golang >Go 言語マイニング ピットを共有する: クロージャ共有変数の問題

Go 言語マイニング ピットを共有する: クロージャ共有変数の問題

藏色散人
藏色散人転載
2021-04-12 11:27:362583ブラウズ

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
理由と解決策については、コードのコメントを参照してください。 。最初の例は間違った例であり、2 番目と 3 番目の例は正しい例です。

以上がGo 言語マイニング ピットを共有する: クロージャ共有変数の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。