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 サイトの他の関連記事を参照してください。