中級 › クロージャがループ外の変数を共有キャプチャして最終値しか残らない › パターン3
クロージャがループ外の変数を共有キャプチャして最終値しか残らない
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 += 10 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 }
出力: [30 30 30]
空欄を埋めて実行を通す
iを使わない定数加算でも、共有変数を直接クロージャに使えば同じ問題が起きます。
次の問題