Code Fix

中級クロージャがループ外の変数を共有キャプチャして最終値しか残らない › パターン1

クロージャがループ外の変数を共有キャプチャして最終値しか残らない

forループの外側で宣言した変数をクロージャの中で使い、そのクロージャをスライスに貯めていく場合、各クロージャは同じ変数を参照し続けます。

 1  package main
 2  
 3  import "fmt"
 4  
 5  func main() {
 6  	var funcs []func() int
 7  	sum := 0
 8  	for i := 0; i < 3; i++ {
 9  		sum += i
10  		s := sum
11  		_ = s
12  		funcs = append(funcs, func() int { return ___ })
                                                 ^
13  	}
14  	var results []int
15  	for _, f := range funcs {
16  		results = append(results, f())
17  	}
18  	fmt.Println(results)
19  }
出力: [3 3 3]

空欄を埋めて実行を通す

広告
広告スロット(未設定)

クロージャがループ外の変数を共有キャプチャして最終値しか残らない

実行時にはループ終了後の最終値だけが全クロージャに共通して見えます。

このエラーの解説と類題をまとめて見る →

広告
広告スロット(未設定)