Go 1.24의 중요한 개선사항들
(gosuda.org)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는 실수입니다.
도구의 도움을 받기 힘든게 가장 큰 문제입니다.
- 문자열이다보니 오타가 나도 오류를 찾기 힘듭니다.
- json을 제외하면 자동완성이나 인텔리센스가 안됩니다.
- 여러 도구를 사용할 때 한 줄에 다 적어야 하는데 가독성이 떨어진다는 느낌을 피할 수 없습니다.
gomodifytags도 나온지는 오랜데 VSC의 Go 익스텐션이랑 통합도 꽤 늦었습니다.