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 구문이 루프 본문의 마지막 구문일 경우에만 해당 구문을 검사합니다.
다른 경우 분석기는 잘못 감지할 수 있습니다.