- 다가오는 Go 1.22 릴리즈는 많은 회사에서 생산 문제를 일으킨 for loop 범위의 일반적인 오류를 수정할 계획입니다.
- 문제는 반복의 끝 이후에 루프 변수에 대한 참조가 유지되어 의도하지 않은 새로운 값을 가지게 될 때 발생합니다.
- 이 문제는 동시 및 비동시 Go 코드에서 모두 흔하며, 변수에 대한 참조가 반복을 초과하는지 분석하는 복잡성 때문에 식별하고 수정하기 어려웠습니다.
- 이러한 실수를 식별하는 기존 도구들은 종종 거짓 부정 또는 거짓 긍정을 초래하여 불필요한 코드 변경이나 간과된 문제를 야기합니다.
- Go 1.22에서 제안된 수정은 for 루프가 반복 범위 대신 루프 범위를 가지도록 변경하여 이러한 종류의 실수와 부정확한 도구의 필요성을 제거할 것입니다.
- 하위 호환성을 유지하기 위해, 새로운 의미론은 go.mod 파일에서 Go 1.22 이상을 선언하는 모듈에 포함된 패키지에서만 적용됩니다.
- 개발자들은 특정 패키지에서 의미론이 변경되는 시기를 제어할 수 있으며, 기존 코드는 현재처럼 계속 작동할 것입니다.
- Go 1.21에는 환경에서 GOEXPERIMENT=loopvar를 설정하여 활성화할 수 있는 범위 변경의 미리보기가 포함되어 있습니다.
- 이 변경 사항은 Google에서 광범위하게 테스트되었으며, 생산 코드에서 보고된 문제는 없습니다.
- 그러나, 루프 변수 문제로 인해 원래 테스트하려던 내용을 테스트하지 못한 일부 테스트는 수정해야 했습니다.
- Go 1.21의 loopclosure 분석기는 이러한 종류의 문제를 식별하고 보고하는 데 개선되어, 개발자들이 Go 1.22에서의 변경에 대비할 수 있도록 도움을 줍니다.
- 이 변경에 대한 자세한 정보는 설계 문서와 FAQ에서 찾을 수 있습니다.