ホームページ  >  記事  >  バックエンド開発  >  Goroutine でクロージャを使用してローカル変数をキャプチャするにはどうすればよいですか?

Goroutine でクロージャを使用してローカル変数をキャプチャするにはどうすればよいですか?

WBOY
WBOYオリジナル
2024-06-05 19:40:01429ブラウズ

Goroutine では、クロージャを使用してローカル変数をキャプチャし、Goroutine の実行中にローカル変数を使用できるようにすることができます。ローカル変数を無名関数の引数として渡すことで、ゴルーチンの開始時に変数をキャプチャできます。クロージャを使用すると、スレッドの安全性を確保しながら、同時に実行するゴルーチン間でデータを共有および変更できます。

如何在 Goroutine 中使用闭包捕获局部变量?

Goroutineでクロージャを使用してローカル変数をキャプチャする方法

クロージャは、作成時にすでに存在する外部変数またはリソースにアクセスできる関数です。 Go では、クロージャは匿名関数を使用して作成されます。

ローカル変数をキャプチャする

Goroutine で匿名関数を開始すると、関数は Goroutine の起動時に存在するすべてのローカル変数をキャプチャできます。

ローカル変数をキャプチャする方法のコード例を次に示します:

package main

import (
    "fmt"
    "time"
)

func main() {
    i := 0

    for i < 10 {
        go func(i int) {
            fmt.Println(i)
        }(i)
        i++
    }

    time.Sleep(time.Second)
}

実践例

クロージャを使用して、並列実行するカウンターを作成できます。各ゴルーチンには独自のプライベート カウンターがあり、同時に安全にアクセスして変更できます。

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
    "time"
)

func main() {
    var wg sync.WaitGroup
    var counter uint64

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            for j := 0; j < 1000000; j++ {
                // 使用原子操作确保并发安全
                atomic.AddUint64(&counter, 1)
            }
            fmt.Println("Goroutine", i, "finished")
        }(i)
    }

    wg.Wait()
    fmt.Println("Total count:", counter)
}

このようにして、10 個のゴルーチンを並行して作成し、各ゴルーチンは独自のカウンターを持ち、100 万回の自己インクリメント操作を同時に実行します。合計数を取得します。各ゴルーチンはクロージャを使用して独自のローカル カウンタ変数をキャプチャするため、カウンタの同時アクセスと変更はスレッドセーフです。

以上がGoroutine でクロージャを使用してローカル変数をキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。