GoSuda

Go 1.24의 새로운 기능은 무엇입니까?

By Lemon Mint
views ...

Go 1.24는 성능, 보안 및 개발자 경험에 중점을 둔 다양한 개선 사항을 도입하며 중요한 릴리스가 될 것으로 예상됩니다. 이러한 변경 사항은 최신 애플리케이션 구축을 위해 Go를 훨씬 더 강력하고 효율적으로 만드는 것을 목표로 합니다.

성능 향상

대표적인 벤치마크 스위트 전반에 걸쳐 CPU 오버헤드가 2-3% 감소하는 전반적인 성능 개선이 이루어졌습니다. 이러한 개선 사항에는 새로운 내장 map 구현, 작은 객체의 보다 효율적인 메모리 할당, 그리고 새로운 런타임 내부 mutex 구현이 포함됩니다. 결과는 애플리케이션에 따라 달라질 수 있습니다.

Post-Quantum 암호화

ML-KEM-768 및 ML-KEM-1024를 구현하는 crypto/mlkem 패키지가 도입되었습니다. ML-KEM은 이전에 Kyber로 알려졌고 FIPS 203에 명시된 Post-Quantum 키 교환 메커니즘입니다. 이 추가는 Go가 미래의 암호화 보안을 준비하도록 합니다.

TLS 개선

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

새로운 Swiss Table Map

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

Sync Map 업데이트

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

향상된 JSON Marshaling

JSON marshaling 동안 더 스마트한 struct 필드 생략을 위한 새로운 omitempty 태그 옵션입니다. marshaling 시, omitempty 옵션이 있는 struct 필드는 해당 값이 0이면 생략됩니다. 필드 유형에 IsZero() bool 메서드가 있는 경우, 해당 메서드는 값이 0인지 여부를 결정하는 데 사용됩니다.

런타임 정리

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

go.mod의 Tool Directives

go.mod의 tool directive를 사용하여 실행 가능한 종속성 추적이 개선되었습니다. 이로써 "tools.go"라는 관례적인 파일에 blank import로 도구를 추가하던 이전의 workaround가 필요 없어졌습니다.

디렉토리 제한 액세스

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

테스트 개선 사항

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

빌드 캐시

go run 실행 파일은 이제 더 빠른 실행을 위해 캐시됩니다. 이는 캐시를 더 크게 만드는 대신 반복적인 실행을 더 빠르게 만듭니다.

Cgo 성능

더 나은 Cgo 성능을 위한 새로운 #cgo noescape#cgo nocallback 주석입니다. #cgo noescape cFunctionName은 C 함수에 전달되는 메모리가 escape되지 않는다고 컴파일러에 알려줍니다. #cgo nocallback cFunctionName은 C 함수가 Go 함수로 콜백하지 않는다고 컴파일러에 알려줍니다.

Weak Pointers

회수를 방지하지 않고 메모리를 안전하게 참조하기 위한 weak pointer 지원입니다. weak pointer는 값 연관을 위한 weak map, 정규화 map, 그리고 다양한 종류의 캐시와 같은 메모리 효율적인 구조 생성을 가능하게 하기 위해 제공되는 저수준 primitive입니다.

벤치마크 개선

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

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

Overview of Go 1.24