1P by neo 4달전 | favorite | 댓글 1개
  • 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.Sincedefer 문에서 사용할 때 발생하는 문제에 대한 새로운 경고가 추가됨.
  • 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 커뮤니티에 긍정적인 영향을 미칠 것으로 기대됨.
Hacker News 의견
  • 타입스크립트 개발자가 최근 Go 언어로 전환한 경험을 공유함. 처음에는 Go의 배열 함수 부족과 유연하지 않은 타입 시스템에 대해 우려를 표함. 하지만 Go를 사용하면서 표준 라이브러리의 우수성, 타입 안전성, 내장된 코딩 표준의 장점을 느낌. 라우팅이 표준 라이브러리로 통합된 것도 긍정적으로 평가함.
  • Go 1.22 버전에 대한 인터랙티브 릴리스 노트를 제공하는 링크를 공유함.
  • 9년 이상 Go를 사용한 개발자가 Dart(Flutter 개발을 위해)와 Go를 비교함. Dart는 가능한 모든 기능을 추가하려 하지만 Go는 반대로 단순함을 추구함. Dart에서는 클래스 초기화 방법이 다양해져 혼란스럽고, Go의 단순함이 그리워짐. Dart의 맵/스트림 등을 사용한 복잡한 단일 표현식은 디버깅 시 또는 초보 개발자에게 혼란을 줄 수 있음.
  • io.Copy가 TCPConn에서 UnixConn으로 복사할 때 Linux의 splice(2) 시스템 호출을 사용할 수 있게 되었음. io 패키지에서 이러한 패턴을 통해 얻을 수 있는 이점을 높이 평가함.
  • Go 1.22 버전에서 라우팅 패턴이 개선되었으나, 이로 인해 소소한 호환성 문제가 발생할 수 있음. 이는 httpmuxgo121 필드를 통해 제어할 수 있음.
  • 어떤 개발자는 Go 언어에 추가된 '함수 범위' 기능을 좋아하지 않음. 이 기능이 언어에 추가된 복잡성에 비해 충분한 편의성을 제공하지 않으며, Go의 명시적이고 단순한 스타일과 어울리지 않는다고 생각함.
  • Go 1.22 버전에서 반복문의 각 반복이 새로운 변수를 생성하는 것에 대한 논의 링크를 공유함.
  • sql.Null[T]의 추가를 환영함. 기존에는 sqlboilernull을 사용했지만, sql.Null과 유사한 API를 가지고 있으며, 값이 명시적으로 설정되었는지 여부를 알려주는 IsSet() bool 메서드가 추가적으로 있음.
  • 표준 라이브러리에 라우팅이 추가된 것을 환영하며, chi 라이브러리를 제거할 수 있을지 고려 중임.
  • Go를 프로덕션에 사용하는 개발자들 사이에서는 새로운 버전으로 빠르게 전환하는지, 아니면 오래된 릴리스에 머무르는지에 대한 질문이 있음. any 키워드 사용에 대한 의견도 나눔.