Go 1.24 릴리스 개요: Swiss Table 맵, ML-KEM, os.Root, 그리고 testing/synctest

Go 1.24는 성능, 보안, 그리고 개발자 경험에 초점을 맞춘 다양한 개선 사항을 도입하며 중요한 릴리스가 될 것으로 보입니다. 이러한 변경 사항은 Go를 현대 애플리케이션 구축에 있어 더욱 강력하고 효율적으로 만드는 것을 목표로 합니다.
성능 향상
대표적인 벤치마크 모음 전반에서 CPU 오버헤드가 2~3% 감소하는 일반적인 성능 개선이 이루어졌습니다. 이러한 개선에는 새로운 내장 맵 구현, 작은 객체의 더 효율적인 메모리 할당, 그리고 새로운 런타임 내부 뮤텍스 구현이 포함됩니다. 결과는 애플리케이션에 따라 다를 수 있습니다.
포스트 양자 암호
crypto/mlkem 패키지가 도입되어 ML-KEM-768과 ML-KEM-1024를 구현합니다. ML-KEM은 이전에 Kyber로 알려졌으며 FIPS 203에 명시된 포스트 양자 키 교환 메커니즘입니다. 이 추가 기능은 암호 보안의 미래에 대비하기 위한 Go의 준비를 의미합니다.
TLS 개선
TLS에서 Encrypted Client Hello(ECH)를 지원합니다. 이 기능은 Config.EncryptedClientHelloKeys 필드를 채워서 활성화할 수 있으며, TLS 연결의 프라이버시와 보안을 강화합니다.
새로운 Swiss Table 맵
더 나은 성능을 위한 향상된 맵 구현입니다. 이 새로운 구현은 Swiss Table을 기반으로 하며, GOEXPERIMENT=noswissmap 빌드 플래그로 비활성화할 수 있습니다.
Sync Map 업데이트
sync.Map의 맵 수정 성능이 향상되었습니다. 더 큰 맵에서 서로 겹치지 않는 키 집합을 수정할 때 경합이 발생할 가능성이 크게 줄어들었으며, 맵에서 낮은 경합 로드를 달성하기 위해 더 이상 점진적 준비 시간(ramp-up time)이 필요하지 않습니다. 문제가 발생하면 GOEXPERIMENT=nosynchashtriemap을 사용하여 이전 구현으로 되돌릴 수 있습니다.
향상된 JSON 마샬링
JSON 마샬링 시 더 스마트한 구조체 필드 생략을 위한 새로운 omitempty 태그 옵션이 추가되었습니다. 마샬링할 때 omitempty 옵션이 지정된 구조체 필드는 해당 값이 제로 값인 경우 생략됩니다. 필드 타입에 IsZero() bool 메서드가 있으면, 값이 제로 값인지 판단하는 데 해당 메서드가 사용됩니다.
런타임 정리
리소스 관리를 개선하기 위해 SetFinalizer를 대체하는 AddCleanup 함수가 도입되었습니다. SetFinalizer와 달리, 연결된 객체를 파이널라이제이션을 위해 되살리지 않으며, 하나의 객체에 여러 개의 cleanup을 연결할 수 있습니다. 새로운 코드에서는 SetFinalizer보다 AddCleanup을 사용하는 것이 좋습니다.
go.mod의 도구 지시자
go.mod의 tool 지시자를 사용하여 실행 파일 의존성 추적이 개선되었습니다. 이로써 이전에 “tools.go”라는 관례적 이름의 파일에 도구를 blank import로 추가하던 우회 방법이 더 이상 필요하지 않습니다.
디렉터리 제한 접근
제어된 파일 시스템 작업을 위한 새로운 os.Root 타입이 추가되었습니다. os.Root 타입은 특정 디렉터리 내에서 파일 시스템 작업을 수행할 수 있게 하며, 지정된 경로 외부로의 접근을 방지합니다.
테스트 개선
동시성 코드 테스트를 위한 새로운 testing/synctest 패키지가 추가되었습니다. synctest.Run 함수는 격리된 “bubble” 안에서 고루틴 그룹을 시작하고, synctest.Wait 함수는 현재 bubble의 모든 고루틴이 블록될 때까지 기다립니다. 이 패키지는 실험적이며, 빌드 시 GOEXPERIMENT=synctest를 설정하여 활성화해야 합니다.
빌드 캐시
go run 실행 파일이 이제 더 빠른 실행을 위해 캐시됩니다. 이로써 반복 실행 속도가 빨라지는 대신 캐시 크기가 커집니다.
Cgo 성능
Cgo 성능 향상을 위한 새로운 #cgo noescape 및 #cgo nocallback 주석이 추가되었습니다. #cgo noescape cFunctionName은 C 함수에 전달된 메모리가 이스케이프되지 않음을 컴파일러에 알립니다. #cgo nocallback cFunctionName은 C 함수가 어떠한 Go 함수도 다시 호출하지 않음을 컴파일러에 알립니다.
약한 포인터
메모리 회수를 방해하지 않으면서 메모리를 안전하게 참조할 수 있도록 약한 포인터(weak pointer)를 지원합니다. 약한 포인터는 값을 연결하기 위한 약한 맵, 정규화 맵, 다양한 종류의 캐시와 같은 메모리 효율적인 구조의 생성을 가능하게 하기 위해 제공되는 저수준 기본 요소입니다.
벤치마크 개선
더 빠르고 오류 가능성이 적은 벤치마크를 위한 새로운 testing.B.Loop 메서드가 추가되었습니다. 벤치마크 함수는 -count마다 정확히 한 번 실행되므로, 비용이 많이 드는 설정 및 정리 단계가 한 번만 실행됩니다. 함수 호출 매개변수와 결과는 계속 유지되어, 컴파일러가 루프 본문을 완전히 최적화하여 제거하는 것을 방지합니다.
Go 1.24는 언어와 생태계의 다양한 측면에서 상당한 개선을 제공하는 중요한 릴리스가 될 것으로 보입니다.
