3P by lemonmint 2일전 | favorite | 댓글 4개

[IMG] Overview of Go 1.24

Go 1.24 버전은 성능, 보안 및 개발자 경험에 초점을 맞춘 다양한 개선 사항을 도입하여 중요한 릴리스가 될 것으로 보입니다. 이러한 변경 사항은 Go를 현대적인 애플리케이션을 구축하는 데 있어 더욱 강력하고 효율적으로 만드는 것을 목표로 합니다.

성능 향상

대표적인 벤치마크 스위트에서 CPU 오버헤드를 2~3% 감소시키는 일반적인 성능 향상이 있었습니다. 이러한 개선 사항에는 새로운 내장 map 구현, 작은 객체의 더욱 효율적인 메모리 할당, 새로운 런타임 내부 뮤텍스 구현이 포함됩니다. 결과는 애플리케이션에 따라 다를 수 있습니다.

양자 내성 암호화

ML-KEM-768 및 ML-KEM-1024를 구현하는 crypto/mlkem 패키지가 도입되었습니다. ML-KEM은 이전에는 Kyber로 알려졌으며 FIPS 203에 명시된 양자 내성 키 교환 메커니즘입니다. 이러한 추가 사항은 Go를 미래의 암호화 보안에 대비하게 합니다.

암호화된 클라이언트 헬로

TLS에서 ECH(Encrypted Client Hello)를 지원합니다. 이 기능은 Config.EncryptedClientHelloKeys 필드를 채워서 활성화할 수 있으며, TLS 연결의 개인 정보 보호 및 보안을 강화합니다.

새로운 Swiss Table Map

더 나은 성능을 위한 향상된 map 구현입니다. 이 새로운 구현은 Swiss Tables를 기반으로 하며, GOEXPERIMENT=noswissmap 빌드 플래그를 사용하여 비활성화할 수 있습니다.

Sync Map 업데이트

sync.Map에서 map 수정 성능이 향상되었습니다. 분리된 키 세트의 수정은 더 큰 map에서 경합할 가능성이 훨씬 적으며, map에서 낮은 경합 부하를 달성하는 데 필요한 준비 시간이 더 이상 없습니다. 문제가 발생하면 GOEXPERIMENT=nosynchashtriemap을 사용하여 이전 구현으로 되돌릴 수 있습니다.

향상된 JSON 마샬링

JSON 마샬링 중 더 스마트한 구조체 필드 생략을 위한 새로운 omitempty 태그 옵션입니다. 마샬링할 때 omitempty 옵션이 있는 구조체 필드의 값이 0이면 생략됩니다. 필드 유형에 IsZero() bool 메서드가 있으면 해당 메서드를 사용하여 값이 0인지 여부를 확인합니다.

런타임 정리

더 나은 리소스 관리를 위해 SetFinalizer를 대체하는 AddCleanup 함수가 도입되었습니다. SetFinalizer와 달리 파이널라이제이션을 위해 연결된 객체를 부활시키지 않으며, 여러 개의 정리를 단일 객체에 연결할 수 있습니다. 새 코드는 SetFinalizer보다 AddCleanup을 선호해야 합니다.

go.mod의 도구 지시어

go.mod의 도구 지시어를 사용하여 툴 종속성 추적이 개선되었습니다. 이를 통해 이전의 해결 방법인 "tools.go"라는 관례적인 이름의 파일에 도구를 공백 가져오기로 추가할 필요가 없어졌습니다.

디렉터리 제한 액세스

제어된 파일 시스템 작업을 위한 새로운 os.Root 유형입니다. os.Root 유형은 특정 디렉터리 내에서 파일 시스템 작업을 수행할 수 있는 기능을 제공하여 지정된 경로 외부의 액세스를 방지합니다.

테스트 개선

동시 코드 테스트를 위한 새로운 testing/synctest 패키지입니다. synctest.Run 함수는 격리된 "버블"에서 goroutine 그룹을 시작하고, synctest.Wait 함수는 현재 버블의 모든 goroutine이 차단될 때까지 기다립니다. 이 패키지는 실험적이며 빌드 시점에 GOEXPERIMENT=synctest를 설정하여 활성화해야 합니다.

빌드 캐시

go run 실행 파일이 이제 더 빠른 실행을 위해 캐시됩니다. 이렇게 하면 캐시가 커지는 대신 반복 실행이 더 빨라집니다.

Cgo 성능

더 나은 Cgo 성능을 위한 새로운 #cgo noescape#cgo nocallback 어노테이션입니다. #cgo noescape cFunctionName은 컴파일러에게 C 함수에 전달된 메모리가 이스케이프되지 않음을 알립니다. #cgo nocallback cFunctionName은 컴파일러에게 C 함수가 Go 함수를 다시 호출하지 않음을 알립니다.

약한 포인터

회수를 방지하지 않고 메모리를 안전하게 참조하기 위한 약한 포인터에 대한 지원입니다. 약한 포인터는 값 연결을 위한 약한 map, 정규화 map 및 다양한 종류의 캐시와 같은 메모리 효율적인 구조를 생성할 수 있도록 제공되는 저수준 기본 요소입니다.

벤치마크 테스트 개선

더 빠르고 오류가 적은 벤치마크를 위한 새로운 testing.B.Loop 메서드입니다. 벤치마크 함수는 -count당 정확히 한 번 실행되므로 비용이 많이 드는 설정 및 정리 단계가 한 번만 실행됩니다. 함수 호출 매개변수와 결과는 유지되므로 컴파일러가 루프 본문을 완전히 최적화하지 못합니다.

Go 1.24 버전은 언어 및 해당 생태계의 다양한 측면에서 상당한 개선을 제공하는 중요한 릴리스가 될 것으로 보입니다.

Go 사용하시는 분들 혹시 바라는 기능이 있으신가요?
저는 .?이랑 ?? 같은 연산자랑 가능하면 매크로가 있었으면 좋겠네요.

솔직히 struct tag는 실수입니다.

저도 개인적으로 매크로가 제발 있었으면 하네요, 언제까지 generate해야 하는지 ㅠ

struct tag가 실수인 이유가 어떤건지 궁금합니다

도구의 도움을 받기 힘든게 가장 큰 문제입니다.

  • 문자열이다보니 오타가 나도 오류를 찾기 힘듭니다.
  • json을 제외하면 자동완성이나 인텔리센스가 안됩니다.
  • 여러 도구를 사용할 때 한 줄에 다 적어야 하는데 가독성이 떨어진다는 느낌을 피할 수 없습니다.

gomodifytags도 나온지는 오랜데 VSC의 Go 익스텐션이랑 통합도 꽤 늦었습니다.