Go 1.25 출시
(go.dev)Go 1.25 버전이 정식으로 출시되었습니다. 이번 버전은 툴, 런타임, 컴파일러, 표준 라이브러리 전반에 걸친 개선 사항을 포함하며, 특히 사용자가 미리 체험하고 피드백을 제공할 수 있는 중요한 실험적 기능들을 선보입니다.
-
주요 특징:
- Go 1 버전과의 호환성 유지
- 툴, 런타임, 컴파일러, 라이브러리 등 광범위한 개선
- 새로운 실험적 기능(GreenTea GC, json/v2 패키지) 도입
핵심 실험적 기능
Go 1.25는 성능 향상과 기능 개선을 목표로 하는 두 가지 주요 실험적 기능을 포함하고 있으며, 사용자는 환경 변수 설정을 통해 활성화할 수 있습니다.
새로운 GreenTea 가비지 컬렉터 (GC)
수많은 작은 객체를 처리할 때 발생하는 GC 오버헤드를 줄여 성능을 향상시키는 것이 목표입니다.
- 작동 방식: 512바이트 미만의 작은 객체들을 8KiB 크기의 '메모리 스팬(Memory Span)' 단위로 그룹화하여 GC를 수행합니다. 이를 통해 메모리 지역성(locality)을 높여 CPU 캐시 효율을 극대화합니다.
-
기대 효과:
- 메모리 점프 비용 감소로 인한 GC 성능 향상
- 다중 코어 환경에서 효율적인 작동
- 작은 객체 할당 오버헤드 및 메모리 파편화 감소
-
활성화 방법: 빌드 시
GOEXPERIMENT=greenteagc
환경 변수 설정
새로운 encoding/json/v2
패키지
기존 encoding/json
(v1)의 일관성 부족, 예측 힘든 동작, 성능 문제를 해결하기 위해 새롭게 설계된 JSON 구현체입니다.
-
핵심 목표:
- 정확성 및 예측 가능성 향상: 기본적으로 더 엄격한 규칙(예: 대소문자 구분, 중복 키 금지)을 적용하여 예기치 않은 동작을 줄입니다.
- 성능 개선: 파싱 및 인코딩 엔진을 재설계하여 효율성을 높였습니다.
- 유연성 및 제어권 확대: 정교한 옵션 시스템을 도입하여 개발자가 JSON 처리 방식을 세밀하게 제어할 수 있습니다.
-
주요 변경점 (v1 대비 v2):
- 필드 이름 매칭: v1의 대소문자 미구분 방식과 달리, v2는 기본적으로 대소문자를 정확히 구분합니다.
-
omitempty
태그 의미 변경: v1이 Go 값의 '빈 상태'(0, false, nil 등)를 기준으로 생략했다면, v2는 인코딩된 JSON 값의 '빈 상태'(null
,""
,{}
,[]
)를 기준으로 생략합니다. -
nil
슬라이스 및 맵 처리: v1은null
로 마샬링했지만, v2는 기본적으로 각각[]
(빈 배열)과{}
(빈 객체)로 마샬링합니다. - 배열 언마샬링: v1은 JSON 배열과 Go 배열의 길이가 달라도 허용했지만, v2는 길이가 정확히 일치해야만 하고, 그렇지 않으면 오류를 반환합니다.
- 중복 키 처리: v1은 중복된 키를 허용(마지막 값으로 덮어씀)했지만, v2는 기본적으로 오류를 반환하여 정확성과 보안을 강화합니다.
-
유효하지 않은 UTF-8 처리: v1은 유효하지 않은 UTF-8 문자를 자동으로 대체(
\uFFFD
)했지만, v2는 기본적으로 오류를 반환하여 데이터 손상을 방지합니다.
-
새로운 기능 및 구조:
-
모듈식 구조: 저수준의 구문 분석(
jsontext
패키지)과 고수준의 의미 변환(json/v2
패키지)을 분리하여 코드 명확성과 성능을 개선했습니다. -
강력한 옵션 시스템:
json.Options
를 통해 다양한 동작을 세밀하게 제어할 수 있으며, v1의 동작을 완벽히 재현하는 것도 가능합니다. -
외부 타입 처리:
WithMarshalers
,WithUnmarshalers
옵션을 통해Marshaler/Unmarshaler
인터페이스를 구현하지 않은 외부 패키지의 타입에 대한 직렬화/역직렬화 로직을 주입할 수 있습니다.
-
모듈식 구조: 저수준의 구문 분석(
-
활성화 방법: 빌드 시
GOEXPERIMENT=jsonv2
환경 변수 설정
주요 변경 사항 및 개선점
이번 릴리스에는 개발 생산성과 프로그램 실행 효율을 높이기 위한 다양한 개선이 이루어졌습니다.
-
런타임 (Runtime)
-
컨테이너 환경 인지 GOMAXPROCS: Linux 환경에서 cgroup의 CPU 제한을 자동으로 인지하여
GOMAXPROCS
기본값을 설정하고, CPU 자원 변경 시 이를 동적으로 업데이트합니다. - Trace Flight Recorder: 드문 버그를 디버깅하기 위해 메모리 내 링 버퍼에 런타임 트레이스를 지속적으로 기록하는 경량화된 추적 기능을 제공합니다.
-
컨테이너 환경 인지 GOMAXPROCS: Linux 환경에서 cgroup의 CPU 제한을 자동으로 인지하여
-
툴 및 컴파일러 (Tools & Compiler)
- nil 포인터 버그 수정: Go 1.21부터 존재했던 nil 포인터 검사를 지연시키는 컴파일러 버그가 수정되어, 비정상적으로 성공하던 코드가 이제 정상적으로 패닉을 일으킵니다.
- DWARF5 지원: 디버깅 정보에 DWARF 버전 5를 사용하여 바이너리 크기와 링크 시간을 줄였습니다.
-
새로운
go.mod ignore
지시어:go
명령어가 특정 디렉터리를 무시하도록 설정할 수 있습니다.
-
표준 라이브러리 (Standard Library)
-
testing/synctest
패키지 추가: 동시성 코드 테스트를 지원하는 새로운 패키지로, 가상화된 시간 속에서 테스트를 격리 실행할 수 있습니다. -
crypto
패키지 성능 향상: FIPS 모드에서의ecdsa
,ed25519
서명 속도가 4배 빨라졌으며, SHA 해싱 속도도 개선되었습니다. -
net/http
CrossOriginProtection 추가: 최신 브라우저의 Fetch 메타데이터를 사용하여 CSRF 공격을 방어하는 새로운 기능을 제공합니다.
-
포트 및 지원 변경
- macOS: Go 1.25부터 macOS 12 Monterey 이상의 버전이 필요합니다.
-
Windows: 32비트
windows/arm
포트는 이번 릴리스를 마지막으로 지원이 중단될 예정입니다.