- Go 1.22 버전은 Go 1.21 이후 6개월 만에 출시됨.
- 대부분의 변경 사항은 툴체인, 런타임, 라이브러리의 구현에 있음.
- Go 1 호환성 약속을 유지하며, 거의 모든 Go 프로그램이 이전과 같이 컴파일 및 실행될 것으로 예상됨.
언어 변경 사항
- "for" 루프에 대한 두 가지 변경 사항이 있음.
- 이전에 "for" 루프에 의해 선언된 변수들은 한 번 생성되고 각 반복에 의해 업데이트되었으나, Go 1.22에서는 루프의 각 반복이 새로운 변수를 생성하여 실수로 공유하는 버그를 방지함.
- "for" 루프는 이제 정수에 대해 범위를 지정할 수 있음.
도구
Go 명령어
- 작업 공간에서
vendor
디렉토리를 사용하여 의존성을 관리할 수 있음.
-
go get
은 더 이상 모듈이 아닌 기존 GOPATH
모드에서 지원되지 않음.
-
go mod init
은 이제 다른 벤더링 도구의 설정 파일에서 모듈 요구 사항을 가져오려고 시도하지 않음.
-
go test -cover
는 이제 자체 테스트 파일이 없는 패키지에 대한 커버리지 요약을 출력함.
Trace
-
trace
도구의 웹 UI가 새로운 트레이서를 지원하기 위해 부분적으로 새롭게 디자인됨.
Vet
- 루프 변수에 대한
vet
도구의 동작이 변경됨.
-
append
에 값을 추가하지 않는 호출에 대해 새로운 경고가 추가됨.
-
time.Since
를 defer
문에서 사용할 때 발생하는 문제에 대한 새로운 경고가 추가됨.
-
log/slog
호출에서 키-값 쌍이 일치하지 않을 때 새로운 경고가 추가됨.
런타임
- 타입 기반 가비지 컬렉션 메타데이터를 힙 객체에 더 가깝게 유지하여 CPU 성능을 1-3% 향상시킴.
컴파일러
- 프로파일 가이드 최적화(PGO) 빌드가 이전보다 더 많은 호출을 가상화할 수 있게 됨.
링커
- 링커의
-s
및 -w
플래그가 모든 플랫폼에서 더 일관되게 동작하도록 변경됨.
부트스트랩
- Go 1.22는 부트스트랩을 위해 Go 1.20의 최종 포인트 릴리스 이상을 요구함.
핵심 라이브러리
새로운 math/rand/v2 패키지
-
math/rand/v2
는 표준 라이브러리의 첫 번째 “v2” 패키지로, math/rand
와 비교하여 여러 가지 중요한 변경 사항이 있음.
새로운 go/version 패키지
- Go 버전 문자열을 검증하고 비교하는 함수를 구현하는 새로운
go/version
패키지가 추가됨.
향상된 라우팅 패턴
- 표준 라이브러리의 HTTP 라우팅이 더 표현력 있게 개선됨.
라이브러리의 소소한 변경 사항
- 다양한 라이브러리에 대한 소소한 변경 사항과 성능 향상이 있음.
포트
Darwin
- macOS에서 64비트 x86 아키텍처(
darwin/amd64
포트)에서 Go 도구 체인은 이제 기본적으로 위치 독립 실행 파일(PIE)을 생성함.
Arm
-
GOARM
환경 변수를 사용하여 소프트웨어 또는 하드웨어 부동 소수점을 선택할 수 있음.
Loong64
-
loong64
포트는 이제 함수 인수와 결과를 레지스터를 사용하여 전달함.
OpenBSD
- OpenBSD에서 big-endian 64비트 PowerPC(
openbsd/ppc64
)에 대한 실험적인 포트가 추가됨.
GN⁺의 의견
- 이번 Go 1.22 릴리스는 특히 "for" 루프의 변경 사항과 새로운
math/rand/v2
패키지의 도입이 주목할 만함. 이러한 변경 사항들은 Go 개발자들에게 더 나은 성능과 안정성을 제공하며, 새로운 기능들은 Go 언어의 발전을 반영함.
-
math/rand/v2
패키지는 더 빠른 알고리즘과 새로운 API를 통해 더 나은 난수 생성 기능을 제공하며, 이는 암호화 및 기타 난수 의존 애플리케이션에 중요한 개선 사항임.
- Go 1.22는 호환성을 유지하면서도 성능과 개발자 경험을 향상시키는 다양한 최적화와 새로운 기능을 제공함으로써, Go 커뮤니티에 긍정적인 영향을 미칠 것으로 기대됨.