中級 › クロージャがループ外の変数を共有キャプチャして最終値しか残らない › パターン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]
空欄を埋めて実行を通す
sumはループの外で宣言された1つの変数で、全クロージャに共有されます。ループの各回でs := sumのように新しい変数へコピーしてから使う必要があります。
次の問題