defergo 구문의 func 리터럴 내 루프 변수에 대한 참조를 보고합니다. 이러한 변수는 func 리터럴로 복사되지 않기 때문에 예기치 못한 값을 가질 수 있습니다. 또한 defergo 구문의 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)
  }()
}

단, 분석기는 defergo 구문이 루프 본문의 마지막 구문일 경우에만 해당 구문을 검사합니다. 다른 경우에는 분석기가 잘못 탐지할 수 있습니다.