1P by neo 2023-09-20 | favorite | 댓글 1개
  • 다가오는 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에서 찾을 수 있습니다.
Hacker News 의견
  • 'Go 1.22'에서 'for loops' 문제에 대한 논의, 클로저에서 루프 변수의 잘못된 사용에 초점
  • 클로저에서 루프 변수의 잘못된 사용 문제는 새로운 것이 아니며, 1992년 Lisp 언어로 거슬러 올라감
  • C# 언어 팀도 이 문제에 직면하고 C# 5.0에서 이를 해결하기 위해 중대한 변경을 시행함
  • Go 1.21은 Go 1.22 이후를 선언하는 코드를 컴파일하지 않아, 새로운 의미에 의존하는 코드가 오래된 의미로 컴파일되지 않음을 보장함
  • 이 변경이 현재의 행동에 의존하는 프로그램을 중단시킬지에 대한 우려가 있음
  • 패키지가 1.22를 고정하고 사용자가 1.18로 컴파일하는 경우 실제로 어떻게 작동할지에 대해 일부 사용자들이 의문을 제기함
  • 이 변경이 메모리 할당 및 루프 성능에 미치는 영향에 대한 질문도 있음
  • 일부 사용자들은 Python과 같은 다른 언어에서 비슷한 문제를 겪은 경험을 공유함
  • Go 1.22의 변경은 언어 구문의 문제를 해결하는 방법으로 보이지만, 한 파일에서 선언된 버전을 알아야 다른 파일의 행동을 이해할 수 있기 때문에 일부 사용자들에게는 직관적이지 않게 느껴짐