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

藏色散人
リリース: 2021-04-12 11:27:49
転載
2527 人が閲覧しました

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート