Go 1.24 릴리스 노트 요약
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Go 1.24 릴리스 노트 요약
Go 1.24는 Go 언어 개발에 있어 중요한 버전 반복입니다. 이전 버전과의 호환성을 유지하면서 수많은 새로운 기능, 최적화 및 개선 사항을 포괄적으로 도입하여 대다수의 Go 프로그램의 원활한 컴파일 및 운영을 효과적으로 보장합니다. 이 업데이트는 개발자에게 더 강력한 프로그래밍 도구를 제공할 뿐만 아니라 Go 언어의 성능, 보안 및 사용성을 크게 향상시킵니다.
I. 언어 변경 사항
Go 1.24는 제네릭 형식 별칭을 완벽하게 지원하여 개발자가 일반 형식 정의와 동일한 방식으로 형식 별칭을 매개변수화할 수 있습니다. 이 기능은 코드 작성의 유연성을 크게 확장하여 코드 재사용성 및 가독성을 크게 향상시킵니다.
// 제네릭 형식 별칭 정의 type MyAlias[T int | string] = T func main() { var num MyAlias[int] = 10 var str MyAlias[string] = "Hello, Go 1.24!" }
현재 개발자는 GOEXPERIMENT=noaliastypeparams
를 설정하여 이 기능을 비활성화할 수 있습니다. 그러나 Go 1.25 버전에서는 aliastypeparams
설정이 공식적으로 제거됩니다.
II. 도구
Go 명령어
Go 모듈에서 tool
지시어를 도입하면 go.mod
파일에서 실행 가능한 종속성을 더 편리하게 추적할 수 있습니다. 이 접근 방식은 이전에 "tools.go" 파일에 빈 가져오기로 도구를 추가하는 방식을 대체합니다. go tool
명령을 통해 이러한 사용자 정의 도구를 실행할 수 있을 뿐만 아니라 Go 배포판에 포함된 다양한 도구를 실행할 수도 있습니다. 또한 go get
명령에는 지정된 패키지에 대한 tool
지시어를 추가하는 데 특별히 사용되는 새로운 -tool
플래그가 있습니다. tool
메타 패턴은 go get tool
, go install tool
과 같이 모듈의 모든 도구를 일괄적으로 업그레이드하거나 설치하는 데 편의성을 제공합니다.
빌드 및 테스트 명령어 향상
go run
및 go tool
로 생성된 실행 파일은 이제 Go 빌드 캐시에 자동으로 캐시됩니다. 이 최적화는 반복 실행 속도를 크게 높이지만 그에 따라 캐시 공간 점유율이 증가합니다. go build
, go install
및 go test
명령어에는 모두 새로운 -json
플래그가 있어 구조화된 JSON 형식으로 빌드 결과 및 오류 메시지를 출력하는 데 사용됩니다. go test -json
출력에서 빌드 및 테스트 결과 JSON 데이터는 새로운 Action
유형으로 구분됩니다. 테스트 통합 시스템에 문제가 있는 경우 개발자는 GODEBUG=gotestjsonbuildtext=1
을 설정하여 텍스트 형식 출력을 복원할 수 있습니다.
인증 및 버전 설정
다양한 시나리오에서 개인 모듈을 획득하기 위한 인증 요구 사항을 충족하기 위해 Go 1.24는 GOAUTH
환경 변수를 추가하여 더 유연한 인증 방법을 제공합니다. go build
명령어는 버전 제어 시스템의 태그 및/또는 커밋 정보를 기반으로 컴파일된 이진 파일의 주 모듈 버전을 설정합니다. 커밋되지 않은 변경 사항이 있는 경우 버전 번호에 +dirty
접미사가 자동으로 추가됩니다. 개발자가 버전 제어 정보를 무시하려는 경우 -buildvcs=false
플래그를 사용할 수 있습니다. 동시에 새로운 GODEBUG
설정 toolchaintrace=1
은 개발자가 go
명령어의 툴체인 선택 프로세스를 추적하는 데 도움이 될 수 있습니다.
Cgo
Cgo는 Go 1.24에서 새로운 기능을 얻어 런타임 성능을 향상시키는 새로운 C 함수 주석을 지원합니다. 그중 #cgo noescape cFunctionName
은 cFunctionname
에 전달된 메모리가 이스케이프되지 않음을 컴파일러에 알리는 데 사용됩니다. #cgo nocallback cFunctionName
은 이 C 함수가 Go 함수를 콜백하지 않음을 나타냅니다. 또한 Cgo의 여러 호환되지 않는 C 함수 선언 검사가 더욱 엄격해졌습니다. 서로 다른 파일에 호환되지 않는 선언이 있는 경우 오류를 더 적시에 정확하게 감지하고 보고할 수 있습니다.
Objdump
Objdump 도구는 Go 1.24에서 지원 범위를 더욱 확장했습니다. 이제 64비트 LoongArch(GOARCH=loong64
), RISC-V(GOARCH=riscv64
) 및 S390X(GOARCH=s390x
) 아키텍처에서 디스어셈블리 작업을 수행할 수 있습니다.
Vet
Vet 도구는 주로 테스트 패키지의 테스트, 퍼즈 테스트, 벤치마크 및 예제의 선언에서 발생할 수 있는 일반적인 오류(예: 잘못된 이름 형식, 잘못된 서명 또는 예제 레코드에 없는 식별자)를 검사하는 데 사용되는 tests
분석기를 추가했습니다. 이 분석기는 go test
를 실행할 때 자동으로 실행됩니다. 동시에 printf
분석기는 fmt.Printf(s)
(여기서 s
는 다른 매개변수가 없는 상수 형식이 아닌 문자열임)에 대한 호출을 진단하고 대신 fmt.Print
를 사용할 것을 제안합니다. buildtag
분석기는 //go:build
지시어에서 잘못된 Go 주요 버전 빌드 제약 조건을 확인합니다. copylock
분석기는 3절 "for" 루프에서 sync.Locker
(예: sync.Mutex
)가 포함된 변수를 감지하는 데 중점을 두어 안전하지 않은 잠금 복사 작업을 효과적으로 방지합니다.
GOCACHEPROG
cmd/go
내부의 이진 및 테스트 캐싱 메커니즘은 이제 GOCACHEPROG
환경 변수를 통해 자식 프로세스에서 구현할 수 있습니다. 자식 프로세스는 JSON 프로토콜을 통해 cmd/go
도구와 상호 작용하여 개발자에게 캐시 관련 작업을 처리할 때 더 많은 유연성과 사용자 정의 기능을 제공합니다.
III. 런타임
Go 1.24는 런타임에 일련의 효과적인 성능 최적화를 수행했습니다. 일련의 대표적인 벤치마크 테스트를 통해 검증된 결과 CPU 오버헤드가 평균 2~3% 감소했습니다. 이러한 최적화는 주로 스위스 테이블을 기반으로 하는 새로운 내장 map
구현, 보다 효율적인 소규모 객체 메모리 할당 및 새로운 런타임 내부 뮤텍스에 반영됩니다. 개발자에게 특별한 요구 사항이 있고 새로운 내장 map
구현과 런타임 내부 뮤텍스를 비활성화하려는 경우 GOEXPERIMENT=noswissmap
및 GOEXPERIMENT=nospinbitmutex
를 각각 설정하여 빌드 프로세스 중에 이를 달성할 수 있습니다.
IV. 컴파일러
Go 1.24에서 컴파일러는 cgo에서 생성된 형식에 대한 검사를 강화했습니다. 수신기가 cgo에서 생성된 형식(직접 또는 별칭 형식을 통해 간접적으로)을 나타내면 컴파일러는 항상 오류 메시지를 보고합니다. 이는 개발자가 개발 프로세스 초기에 잠재적인 문제를 발견하고 해결하는 데 도움이 됩니다.
V. 링커
ELF 플랫폼에서 링커는 기본적으로 GNU 빌드 ID(즉, ELF NT_GNU_BUILD_ID
노트)를 생성합니다. macOS 플랫폼에서는 기본적으로 UUID(즉, Mach-O LC_UUID
로드 명령어)를 생성합니다. 이러한 ID 생성은 Go 빌드 ID에서 파생됩니다. 개발자에게 특별한 요구 사항이 있고 이 기능을 비활성화하려는 경우 -B none
플래그를 사용할 수 있습니다. 사용자 정의 16진수 값을 지정하여 기본 설정을 재정의하려는 경우 -B 0xNNNN
플래그를 사용할 수 있습니다.
VI. 부트스트래핑
Go 1.24의 구성은 Go 1.22.6 이상 버전을 통해 부트스트래핑되어야 합니다. 계획된 대로 Go 1.26 버전에서는 부트스트래핑을 위해 Go 1.24 이상의 포인트 릴리스 버전이 필요할 것으로 예상됩니다.
VII. 표준 라이브러리
디렉토리 제한 파일 시스템 액세스
os.Root
유형과 os.OpenRoot
함수의 출현은 개발자에게 특정 디렉토리 내에서 파일 시스템 작업을 수행할 수 있는 기능을 제공합니다. 이 메커니즘을 통해 모든 작업이 지정된 디렉토리 범위 내에서 엄격하게 제한되어 심볼릭 링크를 통해 외부 위치에 액세스하는 것을 효과적으로 방지하여 파일 시스템 작업의 보안 및 제어 가능성을 향상시킬 수 있습니다.
package main import ( "fmt" "os" ) func main() { root, err := os.OpenRoot("/tmp") if err!= nil { fmt.Println("Error opening root:", err) return } defer root.Close() file, err := root.Create("test.txt") if err!= nil { fmt.Println("Error creating file:", err) return } defer file.Close() }
새로운 벤치마킹 기능
testing.B.Loop
메서드는 기존 b.N
기반 루프 구조보다 더 효율적이고 오류가 발생하기 쉽습니다. 각 -count
가 벤치마크 함수를 한 번만 실행하도록 할 수 있습니다. 이는 비용이 많이 드는 설정 및 정리 단계의 실행 횟수를 줄일 뿐만 아니라 함수 호출 매개변수와 결과를 활성 상태로 유지하여 컴파일러가 루프 본문에 대해 불필요한 최적화를 수행하는 것을 효과적으로 방지합니다.
package main import ( "testing" ) func BenchmarkExample(b *testing.B) { for b.Loop() { // 실제 벤치마크 코드 } }
향상된 종료자
runtime.AddCleanup
함수는 runtime.SetFinalizer
보다 더 유연하고 효율적이며 오류가 발생하기 쉽습니다. 개발자는 정리 함수를 객체에 연결할 수 있습니다. 객체가 연결할 수 없게 되면 정리 함수가 자동으로 실행됩니다. 이 함수는 동일한 객체에 여러 정리 함수를 연결하는 것을 지원하며 내부 포인터에도 연결할 수 있습니다. 객체가 순환 참조를 형성하는 경우 runtime.AddCleanup
은 일반적으로 메모리 누수를 유발하지 않으며 객체와 객체가 가리키는 객체의 릴리스를 지연시키지 않습니다. 따라서 새 코드를 작성할 때는 runtime.AddCleanup
을 먼저 사용하는 것이 좋습니다.
새로운 weak 패키지
weak
패키지를 도입하면 개발자는 약한 포인터를 사용할 수 있으며 이는 약한 맵, 정규 맵 및 다양한 캐시와 같이 메모리 효율적인 구조를 만들 때 매우 유용합니다. runtime.AddCleanup
및 maphash.Comparable
을 결합하면 이러한 시나리오에서 사용 요구 사항을 더 잘 충족하고 프로그램의 메모리 관리 효율성을 더욱 향상시킬 수 있습니다.
새로운 crypto 패키지
crypto/mlkem
패키지는 두 가지 포스트 퀀텀 키 교환 메커니즘인 ML-KEM-768 및 ML-KEM-1024를 성공적으로 구현했습니다. crypto/hkdf
, crypto/pbkdf2
및 crypto/sha3
패키지는 각각 관련 키 파생 함수 및 해시 함수를 구현했습니다. 이러한 패키지 구현은 golang.org/x/crypto/...
패키지를 기반으로 하며 Go 언어가 암호화 분야에서 적용될 수 있도록 더 많은 도구와 지원을 제공합니다.
FIPS 140-3 규정 준수
Go 1.24는 FIPS 140-3 규정 준수를 촉진하기 위한 새로운 메커니즘을 도입했습니다. Go 암호화 모듈은 내부 표준 라이브러리 패키지 세트로서 FIPS 140-3에서 승인한 알고리즘을 투명하게 구현할 수 있습니다. 즉, 애플리케이션은 수정 없이 이러한 준수 알고리즘을 직접 사용할 수 있습니다. GOFIPS140
환경 변수는 빌드 프로세스 중에 사용할 Go 암호화 모듈 버전을 선택하는 데 사용되며 fips140
GODEBUG 설정은 런타임에 FIPS 140-3 모드를 활성화하는 데 사용됩니다. 현재 Go 1.24에 포함된 Go 암호화 모듈 버전 v1.0.0은 CMVP에서 인정한 연구소에서 엄격하게 테스트하고 있습니다.
새로운 실험적 testing/synctest 패키지
testing/synctest
패키지는 특히 동시 코드 테스트에 대한 강력한 지원을 제공합니다. 그중 synctest.Run
함수는 격리된 "버블"에서 goroutine 그룹을 시작할 수 있으며, 여기서 time
패키지의 기능은 가짜 시계를 기반으로 실행됩니다. synctest.Wait
함수는 현재 "버블"의 모든 goroutine이 차단된 상태로 들어갈 때까지 기다리는 데 사용됩니다. 이 패키지는 현재 실험 단계에 있습니다. 빌드 프로세스 중에 활성화하려면 GOEXPERIMENT=synctest
를 설정해야 하며 해당 API는 향후 버전에서 변경될 수 있습니다.
라이브러리에 대한 사소한 변경 사항
Go 1.24는 여러 표준 라이브러리 패키지의 기능을 업데이트하고 메서드를 개선했습니다. 예를 들어 archive
패키지는 빈 디렉토리를 작성할 때 디렉토리 헤더를 자동으로 추가합니다. bytes
및 strings
패키지에는 여러 반복기 관련 함수가 추가되어 개발자가 문자열 및 바이트 조각에서 작동하는 것이 더 쉬워졌습니다. crypto
패키지의 여러 하위 패키지가 해당 메서드와 기능을 조정하고 향상시켜 암호화 관련 기능의 보안과 성능을 더욱 향상시켰습니다. encoding
패키지에 TextAppender
및 BinaryAppender
인터페이스가 추가되어 객체 직렬화 프로세스가 최적화되었습니다. net/http
패키지는 HTTP/2에 대한 지원을 확장하여 개발자에게 보다 강력한 HTTP 서버 및 클라이언트 개발 기능을 제공합니다.
VIII. 포트
Go 1.24는 실행 환경의 포트 요구 사항에도 몇 가지 변경 사항이 있습니다. Linux 시스템에서는 커널 버전이 3.2 이상이어야 합니다. macOS 11 Big Sur를 지원하는 마지막 버전입니다. Go 1.25부터는 macOS 12 Monterey 이상이 필요합니다. WebAssembly의 경우 go:wasmexport
지시어가 추가되어 더 많은 유형과 빌드 모드를 지원하며 관련 지원 파일의 위치도 변경되었습니다. 또한 32비트 windows/arm 포트는 손상된 것으로 표시되어 제대로 작동하지 않을 수 있습니다.
Leapcell: Golang 호스팅을 위한 최고의 서버리스 플랫폼
마지막으로 Golang 서비스를 배포하는 데 가장 적합한 플랫폼인 **Leapcell**을 추천하고 싶습니다.
1. 다국어 지원
- JavaScript, Python, Go 또는 Rust로 개발하세요.
2. 무제한 프로젝트를 무료로 배포하세요
- 사용량에 대해서만 지불하세요. 요청도 없고 청구도 없습니다.
3. 최고의 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하세요.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
4. 간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅
5. 간편한 확장성 및 고성능
- 높은 동시성을 쉽게 처리하기 위한 자동 확장
- 운영 오버헤드가 전혀 없습니다. 빌드에만 집중하세요.
Leapcell Twitter: https://x.com/LeapcellHQ