defer および go ステートメントで func リテラル内からループ変数を参照していることを報告します。
このような変数には予期しない値が代入されている可能性があります。変数が func リテラルにコピーされず、defer および go 内の func リテラルは即座に実行されないためです。
クロージャとゴルーチンに関する詳細は、「What happens with closures running as goroutines?」 (go.dev) を参照してください。
例:
for _, v := range []string{"a", "b", "c"} {
go func() {
fmt.Println(v) // 出力は `a b c` でなく `c c c` になると思われます
}()
}
クイックフィックス適用後:
for _, v := range []string{"a", "b", "c"} {
v := v // ここで `v` がコピーされるようになりました
go func() {
fmt.Println(v)
}()
}
アナライザーが defer および go ステートメントをチェックするのは、これらがループ本体の最後のステートメントである場合に限ります。
それ以外の場合は、解析によって誤検出が生じる可能性があります。