defer 및 go 구문의 func 리터럴 내 루프 변수에 대한 참조를 보고합니다.
이러한 변수는 func 리터럴로 복사되지 않기 때문에 예기치 못한 값을 가질 수 있습니다. 또한 defer 및 go 구문의 func 리터럴은 즉시 실행되지 않습니다.
클로저 및 고루틴에 대한 자세한 내용은 golang.org의 What happens with closures running as goroutines?(고루틴으로서 실행되는 클로저는 어떻게 될까요?)를 참조하세요. goroutines?를 참조하세요.
예:
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 구문이 루프 본문의 마지막 구문일 경우에만 해당 구문을 검사합니다.
다른 경우에는 분석기가 잘못 탐지할 수 있습니다.