[출처] https://go.dev/doc/go1.24

 

Go 1.24 Release Notes - The Go Programming Language

Go 1.24 Release Notes Introduction to Go 1.24 The latest Go release, version 1.24, arrives six months after Go 1.23. Most of its changes are in the implementation of the toolchain, runtime, and libraries. As always, the release maintains the Go 1 promise o

go.dev

 

Go 1.24 릴리스 노트

 

Go 1.24 소개 

최신 Go 릴리스인 버전 1.24는 Go 1.23 이후 6개월 만에 출시되었습니다 . 대부분의 변경 사항은 툴체인, 런타임 및 라이브러리 구현에 있습니다. 항상 그렇듯이 이 릴리스는 Go 1 의 호환성 약속을 유지합니다 . 거의 모든 Go 프로그램이 이전과 같이 컴파일되고 실행되기를 기대합니다.

언어 변경 사항 

Go 1.24는 이제 일반 유형 별칭을 완벽하게 지원합니다 . 유형 별칭은 정의된 유형처럼 매개변수화될 수 있습니다. 자세한 내용은 언어 사양을 참조하세요 . 지금은 GOEXPERIMENT=noaliastypeparams; 를 설정하여 기능을 비활성화할 수 있지만 aliastypeparamsGo 1.25에서는 설정이 제거됩니다.

도구 

Go 명령 

Go 모듈은 이제 toolgo.mod의 지시문을 사용하여 실행 파일 종속성을 추적할 수 있습니다. 이렇게 하면 기존에 "tools.go"라는 이름의 파일에 도구를 빈 가져오기로 추가하는 해결 방법이 필요 없게 됩니다. go tool 이제 명령은 Go 배포판과 함께 제공된 도구 외에도 이러한 도구를 실행할 수 있습니다. 자세한 내용은 설명서를 참조하세요 .

새로운 -tool플래그를 사용하면 go get지정된 패키지에 대한 도구 지침이 현재 모듈에 추가되고 require 지침도 추가됩니다.

새로운 tool 메타 패턴은 현재 모듈의 모든 도구를 참조합니다. 이를 사용하여 go get tool로 모든 도구를 업그레이드하거나 go install tool로 GOBIN 디렉토리에 설치할 수 있습니다.

에서 생성된 실행 파일 go run과 의 새로운 동작은 go tool이제 Go 빌드 캐시에 캐시됩니다. 이렇게 하면 캐시가 더 커지는 대신 반복 실행이 더 빨라집니다. #69290을 참조하세요 .

go build 와 go install 명령어는 이제 빌드 결과와 실패를 표준 출력에 구조화된 JSON 형식으로 보고하는 -json 플래그를 허용합니다. 보고 형식에 대한 자세한 내용은 go help buildjson을 참조하세요.

또한, go test -json은 이제 테스트 결과 JSON과 함께 빌드 출력 및 실패를 JSON으로 보고합니다. 이들은 새로운 Action 유형으로 구별되지만, 테스트 통합 시스템에서 문제를 일으키는 경우 GODEBUG 설정 을 gotestjsonbuildtext=1로 설정하여 텍스트 빌드 출력으로 되돌릴 수 있습니다.

새로운 GOAUTH 환경 변수는 개인 모듈 페치를 인증하는 유연한 방법을 제공합니다. 자세한 내용은 go help goauth 를 참조하세요.

 go build명령은 이제 버전 제어 시스템 태그 및/또는 커밋을 기반으로 컴파일된 바이너리에서 메인 모듈의 버전을+dirty 설정합니다. 커밋되지 않은 변경 사항이 있는 경우 접미사가 추가됩니다. -buildvcs=false플래그를 사용하여 바이너리에서 버전 제어 정보를 생략합니다.

새로운 GODEBUG 설정을 toolchaintrace=1 사용하면 go명령의 도구 체인 선택 프로세스를 추적할 수 있습니다.

Cgo 

Cgo는 런타임 성능 향상을 위해 C 함수에 대한 새로운 어노테이션을 지원합니다. #cgo noescape cFunctionName은 컴파일러에게 C 함수 cFunctionName에 전달된 메모리가 이스케이프하지 않음을 알려줍니다. #cgo nocallback cFunctionName은 컴파일러에게 C 함수 cFunctionName이 Go 함수를 콜백하지 않음을 알려줍니다. 자세한 내용은 cgo 설명서를 참조하세요.

Cgo는 현재 여러 개의 호환되지 않는 선언을 가진 C 함수 호출 컴파일을 거부합니다. 예를 들어, f가 void f(int)와 void f(double) 모두로 선언된 경우, cgo는 f(0)에 대한 잘못된 호출 시퀀스를 생성할 가능성 대신 오류를 보고합니다. 이번 릴리스의 새로운 기능은 호환되지 않는 선언이 다른 파일에 나타날 때 이 오류 조건을 더 잘 감지하는 기능입니다. #67699 참조하세요.

Objdump 

objdump 도구 는 이제 64비트 LoongArch( GOARCH=loong64), RISC-V( GOARCH=riscv64) 및 S390X( GOARCH=s390x)에서 디스어셈블리를 지원합니다.

Vet 

새로운 tests 분석기는 테스트 패키지의 테스트, 퍼저, 벤치마크 및 예제 선언에서 일반적인 실수를 보고합니다. 예를 들어 잘못된 이름, 잘못된 시그니처 또는 존재하지 않는 식별자를 문서화하는 예제 등이 있습니다. 이러한 실수 중 일부는 테스트가 실행되지 않도록 할 수 있습니다. 이 분석기는 go test에 의해 실행되는 분석기 하위 집합에 속합니다.

기존의 printf 분석기는 이제 fmt.Printf(s) 형태의 호출에 대한 진단을 보고합니다. 여기서 s는 상수 문자열이 아닌 형식 문자열이며 다른 인수가 없습니다. 이러한 호출은 s의 값에 % 기호가 포함될 수 있으므로 거의 항상 실수입니다. 대신 fmt.Print를 사용하세요. #60529를 참조하세요. 이 검사는 기존 코드에서 결과를 생성하는 경향이 있으므로, (go.mod go 지시어 또는 //go:build 주석에 의해 지정된) 언어 버전이 최소 Go 1.24 이상인 경우에만 적용되어 1.24 Go 툴체인으로 업데이트할 때 지속적인 통합 실패를 방지합니다.

기존의 buildtag 분석기는 이제 //go:build 지시어 내에 잘못된 Go  주요 버전 빌드 제약이 있을 때 진단을 보고합니다. 예를 들어 //go:build go1.23.1은 특정 릴리스 버전을 참조합니다. 대신 //go:build go1.23을 사용하세요. #64127을 참조하세요.

기존의 copylock 분석기는 이제 for i := iter(); done(i); i = next(i) { ... }와 같은 3절 "for" 루프에서 선언된 변수가 sync.Mutex와 같은 sync.Locker를 포함할 때 진단을 보고합니다. Go 1.22는 이러한 루프의 동작을 각 반복에 대해 새 변수를 생성하고 이전 반복에서 값을 복사하도록 변경했습니다. 이 복사 작업은 잠금에 안전하지 않습니다. #66387을 참조하세요.

GOCACHEPROG 

cmd/go 내부 바이너리 및 테스트 캐싱 메커니즘은 이제 GOCACHEPROG 환경 변수에 지정된 자식 프로세스와 cmd/go 도구 간의 JSON 프로토콜을 구현하는 자식 프로세스에 의해 구현될 수 있습니다. 이전에는 GOEXPERIMENT 뒤에 있었습니다. 프로토콜 세부 정보는 설명서를 참조하세요.

런타임 

런타임에 대한 몇 가지 성능 개선으로 인해 대표적인 벤치마크 모음에서 평균적으로 CPU 오버헤드가 2~3% 감소했습니다. 결과는 애플리케이션에 따라 다를 수 있습니다. 이러한 개선 사항에는 Swiss Tables 기반의 새로운 내장 map 구현, 작은 객체의 더 효율적인 메모리 할당, 그리고 새로운 런타임 내부 뮤텍스 구현이 포함됩니다.

새로운 내장 map 구현과 새로운 런타임 내부 뮤텍스는 빌드 시 각각 GOEXPERIMENT=noswissmap 및 GOEXPERIMENT=nospinbitmutex를 설정하여 비활성화할 수 있습니다.

컴파일러 

컴파일러는 이미 cgo에서 생성된 수신자 유형으로 새 메서드를 정의하는 것을 허용하지 않았지만 별칭 유형을 통해 해당 제한을 우회할 수 있었습니다. Go 1.24는 이제 수신자가 cgo에서 생성된 유형을 나타내는 경우 직접적이든 간접적이든(별칭 유형을 통해) 항상 오류를 보고합니다.

링커 

링커는 이제 기본적으로 NT_GNU_BUILD_IDELF 플랫폼에서 GNU 빌드 ID(ELF 노트)를 생성하고 macOS에서 UUID(Mach-O 로드 명령)를 생성합니다. 빌드 ID 또는 UUID는 Go 빌드 ID에서 파생됩니다. 링커 플래그로 비활성화하거나 사용자가 지정한 16진수 값으로 링커 플래그로 재정의할 수 있습니다.LC_UUID-B none-B 0xNNNN

부트스트랩 

Go 1.22 릴리스 노트 에 언급된 대로 , Go 1.24는 이제 부트스트랩을 위해 Go 1.22.6 이상이 필요합니다. Go 1.26은 부트스트랩을 위해 Go 1.24 이상의 포인트 릴리스가 필요할 것으로 예상합니다.

표준 라이브러리 

디렉토리 제한 파일 시스템 액세스 

새로운 os.Root 유형은 특정 디렉토리 내에서 파일 시스템 작업을 수행하는 기능을 제공합니다.

o os.OpenRoot 함수는 디렉토리를 열고 os.Root 를 반환합니다. os.Root 의 메서드는 디렉토리 내에서 작동하며 디렉토리 외부의 위치를 참조하는 경로, 디렉토리 외부의 심볼릭 링크를 따라가는 경로를 허용하지 않습니다. os.Root의 메서드는 os 패키지에서 사용할 수 있는 대부분의 파일 시스템 작업을 미러링합니다. 예를 들어 os.Root.Open,  os.Root.Create,  os.Root.Mkdir 및 os.Root.Stat 등이 있습니다.

새로운 벤치마크 기능 

이제 벤치마크는 일반적인 for range b.N과 같은 b.N 관련 루프 구조 대신 for b.Loop() { ... }와 같이 testing.B.Loop 메서드를 사용하여 더 빠르고 오류가 적은 벤치마크 반복을 수행할 수 있습니다. 이는 두 가지 중요한 장점을 제공합니다.

  • 벤치마크 함수는 -count당 정확히 한 번 실행되므로 비용이 많이 드는 설정 및 정리 단계가 한 번만 실행됩니다.
  • 함수 호출 매개변수와 결과가 활성 상태로 유지되어 컴파일러가 루프 본문을 완전히 최적화하지 못하게 합니다.

개선된 finalizer 

새로운  runtime.AddCleanup 함수는 runtime.SetFinalizer 보다 더 유연하고 효율적이며 오류가 적은 종료 메커니즘입니다. AddCleanup은 객체가 더 이상 도달할 수 없을 때 한 번 실행될 정리 함수를 객체에 연결합니다. 그러나 SetFinalizer와 달리 여러 개의 정리 함수를 단일 객체에 연결할 수 있고, 정리 함수를 내부 포인터에 연결할 수 있으며, 객체가 순환을 형성할 때 정리 함수가 일반적으로 누수를 일으키지 않고, 정리 함수가 객체 또는 객체가 가리키는 객체의 해제를 지연시키지 않습니다. 새로운 코드는 SetFinalizer보다 AddCleanup을 선호해야 합니다.

새로운 weak 패키지 

새로운 weak 패키지에는 약점이 있습니다

Weak 포인터는 값 연결을 위한 약한 맵, unique 패키지에서 다루지 않는 모든 것을 위한 정규화 맵, 그리고 다양한 종류의 캐시와 같은 메모리 효율적인 구조 생성을 가능하게 하기 위해 제공되는 저수준 기본 요소입니다. 이러한 사용 사례를 지원하기 위해 이번 릴리스에서는 runtime.AddCleanupmaphash.Comparable 도 제공합니다.

새로운 crypto/mlkem 패키지 

새로운 crypto/mlkem패키지는 ML-KEM-768 및 ML-KEM-1024를 구현합니다.

ML-KEM은 이전에 Kyber로 알려졌으며 FIPS 203 에 명시된 포스트 양자 키 교환 메커니즘입니다 .

새로운 crypto/hkdf, crypto/pbkdf2 및 crypto/sha3 패키지 

새로운 패키지는 RFC 5869crypto/hkdf 에 정의된 HMAC 기반 추출 및 확장 키 파생 함수 HKDF를 구현합니다 .

새로운 패키지는 RFC 8018crypto/pbkdf2 에 정의된 암호 기반 키 파생 함수 PBKDF2를 구현합니다 .

새로운 패키지는 FIPS 202crypto/sha3 에 정의된 대로 SHA-3 해시 함수와 SHAKE 및 cSHAKE 확장 가능 출력 함수를 구현합니다 .

세 가지 패키지 모두 기존 golang.org/x/crypto/...패키지를 기반으로 합니다.

FIPS 140-3 준수 

이 릴리스에는 FIPS 140-3 규정 준수를 용이하게 하는 새로운 메커니즘 세트가 포함되어 있습니다 .

Go Cryptographic Module은 FIPS 140-3 승인 알고리즘을 구현하는 데 투명하게 사용되는 내부 표준 라이브러리 패키지 세트입니다. 애플리케이션은 승인된 알고리즘에 Go Cryptographic Module을 사용하기 위해 변경이 필요하지 않습니다.

새로운 GOFIPS140환경 변수는 빌드에서 사용할 Go Cryptographic Module 버전을 선택하는 데 사용할 수 있습니다. 새로운 fips140 GODEBUG 설정은 런타임에 FIPS 140-3 모드를 활성화하는 데 사용할 수 있습니다.

Go 1.24에는 현재 CMVP 인증 실험실에서 테스트 중인 Go 암호화 모듈 버전 v1.0.0이 포함되어 있습니다.

새로운 실험 테스트/동기 테스트 패키지 

새로운 실험 testing/synctest패키지는 동시 코드 테스트를 지원합니다.

  •  synctest.Run함수는 고립된 "버블"에서 고루틴 그룹을 시작합니다. 버블 내에서 time패키지 함수는 가짜 시계에서 작동합니다.
  •  synctest.Wait함수는 현재 버블에 있는 모든 고루틴이 차단될 때까지 기다립니다.

자세한 내용은 패키지 설명서를 참조하세요.

 synctest패키지는 실험적이며 GOEXPERIMENT=synctest빌드 시 설정하여 활성화해야 합니다. 패키지 API는 향후 릴리스에서 변경될 수 있습니다. 자세한 내용과 피드백을 제공하려면 문제 #67434를 참조하세요.

라이브러리의 사소한 변경 사항 

archive

(*Writer).AddFS두 구현 모두  archive/zip디렉토리 archive/tar 에 대한 디렉토리 헤더를 작성합니다.

bytes

bytes  패키지는 반복자와 함께 작동하는 여러 함수를 추가합니다.

  • Lines 는 바이트 슬라이스에서 newline으로 끝나는 줄에 대한 반복자를 반환합니다.
  • SplitSeq 는 구분자를 중심으로 분할된 바이트 슬라이스의 모든 하위 슬라이스에 대한 반복자를 반환합니다.
  • SplitAfterSeq 는 각 구분자 인스턴스 뒤에서 분할된 바이트 슬라이스의 하위 슬라이스에 대한 반복자를 반환합니다.
  • FieldsSequnicode.IsSpace 에 정의된 대로 공백 문자 실행을 중심으로 분할된 바이트 슬라이스의 하위 슬라이스에 대한 반복자를 반환합니다.
  • FieldsFuncSeq 는 술어(predicate)를 만족하는 유니코드 코드 포인트 실행을 중심으로 분할된 바이트 슬라이스의 하위 슬라이스에 대한 반복자를 반환합니다.

crypto/aes

NewCipher 가 반환하는 값은 더 이상 NewCTR, NewGCM, NewCBCEncrypter 및 NewCBCDecrypter 메서드를 구현하지 않습니다. 이러한 메서드는 문서화되지 않았으며 모든 아키텍처에서 사용할 수 없었습니다. 대신 Block 값을 관련 crypto/cipher 함수에 직접 전달해야 합니다. 현재  crypto/cipher 는 표준 라이브러리에서 더 이상 사용되지 않더라도 Block 값에서 해당 메서드를 계속 확인합니다.

crypto/cipher

새로운  NewGCMWithRandomNonce 함수는 Seal 중에 임의의 nonce를 생성하고 암호문에 추가하여 AES-GCM을 구현하는 AEAD 를 반환합니다.

crypto/aes와 함께 사용될 때 NewCTR에서 반환된 Stream 구현은 이제 amd64 및 arm64에서 몇 배 더 빠릅니다.

NewCTRcrypto/aes,NewOFB, NewCFBEncrypter, 및 는 NewCFBDecrypter는 이제 더 이상 사용되지 않습니다. OFB 및 CFB 모드는 인증되지 않으므로 일반적으로 능동적 공격을 통해 일반 텍스트를 조작하고 복구할 수 있습니다. 애플리케이션은 대신 AEAD 모드를 사용하는 것이 좋습니다. 인증되지 않은 Stream 모드가 필요한 경우 대신 NewCTR 을 사용하세요.

crypto/ecdsa

PrivateKey.Sign이제 무작위 소스가 nil인 경우 RFC 6979 에 따라 결정적 서명을 생성합니다 .

crypto/md5

지금 까지 반환된 값 md5.New encoding.BinaryAppender인터페이스를 구현합니다.

crypto/rand

Read 함수는 이제 실패하지 않도록 보장됩니다. 항상 nil을 error 결과로 반환합니다. Read가 Reader에서 읽는 동안 오류를 만나면 프로그램은 복구 불가능하게 충돌합니다. 기본 Reader에서 사용하는 플랫폼 API는 항상 성공하도록 문서화되어 있으므로 이 변경 사항은 Reader 변수를 재정의하는 프로그램에만 영향을 미칩니다. 한 가지 예외는 3.17 이전 버전의 Linux 커널로, 여기서 기본 Reader는 여전히 /dev/urandom을 열고 실패할 수 있습니다.

Linux 6.11 이상에서 Reader는 이제 vDSO를 통해 getrandom 시스템 호출을 사용합니다. 특히 작은 읽기의 경우 몇 배 더 빠릅니다.

OpenBSD에서 Reader는 이제 arc4random_buf(3)를 사용합니다.

새로운 Text 함수를 사용하여 암호학적으로 안전한 임의의 텍스트 문자열을 생성할 수 있습니다.

crypto/rsa

GenerateKey는 이제 1024비트 미만의 키가 요청되면 오류를 반환합니다. 모든 Sign, Verify, Encrypt 및 Decrypt 메서드는 1024비트보다 작은 키와 함께 사용될 경우 오류를 반환합니다. 이러한 키는 안전하지 않으므로 사용해서는 안 됩니다. GODEBUG 설정 rsa1024min=0은 이전 동작을 복원하지만, 예를 들어 테스트 파일에 //go:debug rsa1024min=0 줄을 추가하는 등 필요한 경우와 테스트에서만 사용하는 것이 좋습니다. 새로운 GenerateKey 예제는 사용하기 쉬운 표준 2048비트 테스트 키를 제공합니다.

이제 PrivateKey.Validate 전에 PrivateKey.Precompute를 호출하는 것이 안전하고 더 효율적입니다. Precompute는 JSON에서 키를 언마샬링하는 경우와 같이 부분적으로 채워진 PrecomputedValues가 있는 경우 이제 더 빠릅니다.

이 패키지는 이제 Validate가 호출되지 않은 경우에도 더 많은 잘못된 키를 거부하며, GenerateKey는 손상된 난수 소스에 대한 새로운 오류를 반환할 수 있습니다. PrivateKey의 Primes 및 Precomputed 필드는 이제 일부 값이 누락된 경우에도 사용되고 유효성이 검사됩니다. 아래에 설명된 RSA 키의 crypto/x509 파싱 및 마샬링 변경 사항도 참조하세요.

SignPKCS1v15 및 VerifyPKCS1v15는 이제 SHA-512/224, SHA-512/256 및 SHA-3을 지원합니다.

GenerateKey는 이제 개인 지수를 생성하는 약간 다른 방법(오일러의 토션트 대신 카마이클의 토션트)을 사용합니다. 소수 인자에서 외부적으로 키를 재생성하는 드문 애플리케이션은 다른 결과(하지만 호환 가능)를 생성할 수 있습니다.

공개 키 및 개인 키 작업은 이제 wasm에서 최대 두 배 더 빠릅니다.

crypto/sha1

지금 까지 반환된 값 sha1.New encoding.BinaryAppender인터페이스를 구현합니다.

crypto/sha256

sha256.New와 에서 반환된 값은 sha256.New224이제 encoding.BinaryAppender인터페이스를 구현합니다.

crypto/sha512

sha512.New, sha512.New384, 에서 반환된 값 sha512.New512_224 sha512.New512_256이제 encoding.BinaryAppender인터페이스를 구현합니다.

crypto/subtle

새로운 WithDataIndependentTiming 기능을 사용하면 특정 명령어가 데이터 값 타이밍 불변임을 보장하는 아키텍처별 기능이 활성화된 함수를 실행할 수 있습니다. 이를 사용하면 상수 시간으로 실행되도록 설계된 코드가 가변 시간으로 작동하도록 CPU 수준 기능에 의해 최적화되지 않도록 할 수 있습니다. 현재 WithDataIndependentTimingarm64에서 PSTATE.DIT 비트를 사용하고 다른 모든 아키텍처에서는 no-op입니다. GODEBUG 설정은 dataindependenttiming=1 전체 Go 프로그램에 대해 DIT 모드를 활성화합니다.

출력 XORBytes은 입력과 정확히 겹치거나 전혀 겹치지 않아야 합니다. 이전에는 동작이 정의되지 않았지만 이제는 XORBytes패닉 상태가 됩니다.

crypto/tls

TLS 서버는 이제 암호화된 클라이언트 Hello(ECH)를 지원합니다. 이 기능은 필드를 채워서 활성화할 수 있습니다 Config.EncryptedClientHelloKeys.

새로운 포스트 양자 X25519MLKEM768키 교환 메커니즘이 이제 지원되고 Config.CurvePreferencesnil일 때 기본적으로 활성화됩니다. GODEBUG 설정은 tlsmlkem=0 기본값으로 돌아갑니다.

실험적 X25519Kyber768Draft00키 교환에 대한 지원이 제거되었습니다.

키 교환 순서는 이제 전적으로 crypto/tls패키지에서 처리합니다. 이제 순서는 Config.CurvePreferences무시되고, 내용은 필드가 채워질 때 활성화할 키 교환을 결정하는 데에만 사용됩니다.

 ClientHelloInfo.Extensions 필드는 클라이언트 Hello 메시지에서 수신된 확장의 ID를 나열합니다. 이는 TLS 클라이언트 지문을 찍는 데 유용할 수 있습니다.

crypto/x509

x509sha1 GODEBUG 설정이 제거되었습니다. Certificate.Verify는 더 이상 SHA-1 기반 서명을 지원하지 않습니다.

OID는 이제 encoding.BinaryAppender 및 encoding.TextAppender 인터페이스를 구현합니다.

기본 인증서 정책 필드가 Certificate.PolicyIdentifiers에서 Certificate.Policies로 변경되었습니다. 인증서를 파싱할 때 두 필드 모두 채워지지만, 인증서를 생성할 때 정책은 이제 Certificate.PolicyIdentifiers 필드 대신 Certificate.Policies 필드에서 가져옵니다. 이 변경 사항은 GODEBUG 설정을 x509usepolicies=0으로 설정하여 되돌릴 수 있습니다.

CreateCertificate는 이제 Certificate.SerialNumber 필드가 nil인 템플릿이 전달될 때 실패하는 대신 RFC 5280 규격 메서드를 사용하여 일련 번호를 생성합니다.

Certificate.Verify는 이제 RFC 5280 및 RFC 9618에 정의된 대로 정책 유효성 검사를 지원합니다. 새로운 VerifyOptions.CertificatePolicies 필드를 허용 가능한 정책 OID 집합으로 설정할 수 있습니다. 유효한 정책 그래프가 있는 인증서 체인만 Certificate.Verify에서 반환됩니다.

MarshalPKCS8PrivateKey는 이제 잘못된 RSA 키를 마샬링하는 대신 오류를 반환합니다. (MarshalPKCS1PrivateKey에는 오류 반환이 없으며, 잘못된 키가 제공될 때의 동작은 계속 정의되지 않습니다.)

ParsePKCS1PrivateKey 및 ParsePKCS8PrivateKey는 이제 인코딩된 CRT 값을 사용하고 검증하므로 이전에 허용되었던 잘못된 RSA 키를 거부할 수 있습니다. GODEBUG 설정을 x509rsacrt=0으로 설정하여 CRT 값 재계산으로 되돌립니다.

debug/elf

debug/elf 패키지는 동적 ELF (Executable and Linkable Format) 파일의 심볼 버전 처리를 지원합니다. 새로운 File.DynamicVersions 메서드는 ELF 파일에 정의된 동적 버전 목록을 반환합니다. 새로운 File.DynamicVersionNeeds 메서드는 다른 ELF 객체에 정의된 이 ELF 파일에 필요한 동적 버전 목록을 반환합니다. 마지막으로, 새로운 Symbol.HasVersion 및 Symbol.VersionIndex 필드는 심볼의 버전을 나타냅니다.

encoding

두 개의 새로운 인터페이스인 TextAppender와 BinaryAppender가 도입되어 객체의 텍스트 또는 바이너리 표현을 바이트 슬라이스에 추가합니다. 이러한 인터페이스는 TextMarshaler 및 BinaryMarshaler와 동일한 기능을 제공하지만, 매번 새로운 슬라이스를 할당하는 대신 데이터를 기존 슬라이스에 직접 추가합니다. 이러한 인터페이스는 이제 TextMarshaler 및/또는 BinaryMarshaler를 이미 구현한 표준 라이브러리 유형에 의해 구현됩니다.

encoding/json

마샬링할 때, 구조체 필드 태그에 새로운 omitzero 옵션이 있는 구조체 필드는 값이 0이면 생략됩니다. 필드 유형에 IsZero() bool 메서드가 있으면 해당 메서드를 사용하여 값이 0인지 여부를 확인합니다. 그렇지 않으면 값이 해당 유형의 0 값이면 0입니다. omitzero 필드 태그는 0 값을 생략하려는 의도를 나타낼 때 omitempty보다 명확하고 오류가 적습니다. 특히 omitempty와 달리 omitzero는 일반적인 마찰 원인인 0 값의 time.Time 값을 생략합니다.

omitempty와 omitzero가 모두 지정되면 값empty 또는 0 (또는 둘 다) 인 경우 필드가 생략됩니다.

UnmarshalTypeError.Field는 이제 포함된 구조체를 포함하여 더 자세한 오류 메시지를 제공합니다.

go/types

Len() int와 At(int) T와 같은 메서드 쌍을 사용하여 시퀀스를 노출하는 모든 go/types 데이터 구조는 이제 반복자를 반환하는 메서드도 가지게 되어 다음과 같은 코드를 단순화할 수 있습니다.

params := fn.Type.(*types.Signature).Params()
for i := 0; i < params.Len(); i++ {
   use(params.At(i))
}

이것에:

for param := range fn.Signature().Params().Variables() {
   use(param)
}

메소드 :  Interface.EmbeddedTypes, Interface.ExplicitMethods, Interface.Methods, MethodSet.Methods, Named.Methods, Scope.Children, Struct.Fields, Tuple.Variables, TypeList.Types, TypeParamList.TypeParams, Union.Terms.

hash/adler32

지금 까지 반환된 값 New encoding.BinaryAppender인터페이스를 구현합니다.

hash/crc32

New와 에서 반환된 값은 NewIEEE이제 encoding.BinaryAppender인터페이스를 구현합니다.

hash/crc64

지금 까지 반환된 값 New encoding.BinaryAppender인터페이스를 구현합니다.

hash/fnv

New32, New32a, New64, New64a, 에서 반환된 값 New128 New128a이제 encoding.BinaryAppender인터페이스를 구현합니다.

hash/maphash

새로운 함수 Comparable WriteComparable함수는 모든 비교 가능한 값의 해시를 계산할 수 있습니다. 이를 통해 Go 맵 키로 사용할 수 있는 모든 것을 해시할 수 있습니다.

log/slog

새로운 DiscardHandler핸들러는 활성화되지 않고 항상 출력을 버립니다.

Level이제 인터페이스를 LevelVar구현합니다 encoding.TextAppender.

math/big

Float, Int  및 Rat 은 이제 encoding.TextAppender 인터페이스를 구현합니다.

math/rand

더 이상 사용되지 않는 최상위 레벨의 Seed 함수 호출은 더 이상 아무런 효과가 없습니다. 이전 동작을 복원하려면 GODEBUG 설정을 randseednop=0으로 사용하세요. 자세한 배경은 제안 #67273 을 참조하세요.

math/rand/v2

ChaCha8  및 PCG 는 이제 encoding.BinaryAppender 인터페이스를 구현합니다.

net

ListenConfig 는 이제 지원되는 시스템(현재 Linux에서만)에서 기본적으로 MPTCP를 사용합니다.

IP 는 이제 encoding.TextAppender 인터페이스를 구현합니다.

net/http

Transport요청에 대한 응답으로 수신된 1xx 정보 응답에 대한 '의 제한이 변경되었습니다. 이전에는 5개 이상의 1xx 응답을 수신한 후 요청을 중단하고 오류를 반환했습니다. 이제 모든 1xx 응답의 총 크기가 Transport.MaxResponseHeaderBytes구성 설정을 초과하면 오류를 반환합니다.

또한, 요청에 net/http/httptrace.ClientTrace.Got1xxResponse 추적 후크가 있는 경우 이제 1xx 응답의 총 수에 제한이 없습니다. Got1xxResponse후크는 요청을 중단하기 위해 오류를 반환할 수 있습니다.

Transport이제 ServerHTTP/2 프로토콜 설정을 구성할 수 있는 HTTP2 필드가 있습니다.

새로운 Server.Protocols필드 Transport.Protocols는 서버나 클라이언트가 사용하는 HTTP 프로토콜을 구성하는 간단한 방법을 제공합니다.

서버와 클라이언트는 암호화되지 않은 HTTP/2 연결을 지원하도록 구성될 수 있습니다.

UnencryptedHTTP2가 포함된 경우 Server.Protocols서버는 암호화되지 않은 포트에서 HTTP/2 연결을 허용합니다. 서버는 동일한 포트에서 HTTP/1과 암호화되지 않은 HTTP/2를 모두 허용할 수 있습니다.

UnencryptedHTTP2를 포함하고 HTTP1을 포함하지 않는 경우 Transport.Protocols, 전송은 http:// URL에 대해 암호화되지 않은 HTTP/2를 사용합니다. 전송이 HTTP/1과 암호화되지 않은 HTTP/2를 모두 사용하도록 구성된 경우 HTTP/1을 사용합니다.

암호화되지 않은 HTTP/2 지원은 "사전 지식이 있는 HTTP/2"(RFC 9113, 섹션 3.3)를 사용합니다. 더 이상 사용되지 않는 "업그레이드: h2c" 헤더는 지원되지 않습니다.

net/netip

Addr, AddrPort  및 Prefix 는 이제 encoding.BinaryAppender encoding. TextAppender 인터페이스를 구현합니다.

net/url

URL이제 encoding.BinaryAppender인터페이스도 구현합니다.

os/user

Windows에서 Current 는 이제 Windows Nano Server에서 사용할 수 있습니다. Nano Server에서 사용할 수 없는 NetApi32 라이브러리의 함수를 사용하지 않도록 구현이 업데이트되었습니다.

Windows에서 Current ,  LookupLookupId 는 이제 다음 내장 서비스 사용자 계정을 지원합니다.

  • NT AUTHORITY\SYSTEM
  • NT AUTHORITY\LOCAL SERVICE
  • NT AUTHORITY\NETWORK SERVICE

Windows에서 Current 는 현재 사용자가 느린 도메인에 가입되어 있을 때 (많은 기업 사용자의 일반적인 경우) 상당히 빨라졌습니다. 새로운 구현 성능은 이제 몇 밀리초 수준으로, 이전 구현에서 완료하는 데 몇 초 또는 심지어 몇 분이 걸릴 수 있었던 것에 비해 크게 개선되었습니다.

Windows에서 Current 는 이제 현재 스레드가 다른 사용자를 가장하고 있을 때 프로세스 소유자 사용자를 반환합니다. 이전에는 오류를 반환했습니다.

regexp

Regexp이제 encoding.TextAppender인터페이스를 구현합니다.

runtime

 GOROOT기능은 이제 더 이상 사용되지 않습니다. 새 코드에서는 시스템 경로를 사용하여 "go" 바이너리를 찾고, go env GOROOTGOROOT를 찾는 것을 선호합니다.

strings

 strings  패키지는 반복자와 함께 작동하는 여러 함수를 추가합니다.

  • Lines 는 문자열에서 newline으로 끝나는 줄에 대한 반복자를 반환합니다.
  • SplitSeq 는 구분자를 중심으로 분할된 문자열의 모든 하위 문자열에 대한 반복자를 반환합니다.
  • SplitAfterSeq 는 각 구분자 인스턴스 뒤에서 분할된 문자열의 하위 문자열에 대한 반복자를 반환합니다.
  • FieldsSequnicode.IsSpace 에 정의된 대로 공백 문자 실행을 중심으로 분할된 문자열의 하위 문자열에 대한 반복자를 반환합니다.
  • FieldsFuncSeq 는 술어(predicate)를 만족하는 유니코드 코드 포인트 실행을 중심으로 분할된 문자열의 하위 문자열에 대한 반복자를 반환합니다.

sync

구현이 sync.Map변경되어 성능이 향상되었으며, 특히 맵 수정의 경우 그렇습니다. 예를 들어, 분리된 키 집합의 수정은 더 큰 맵에서 경쟁할 가능성이 훨씬 낮으며, 맵에서 낮은 경쟁 부하를 달성하는 데 필요한 램프업 시간이 더 이상 없습니다.

문제가 발생하면 GOEXPERIMENT=nosynchashtriemap빌드 시점에 이전 구현으로 다시 전환하고 문제를 제출 하세요 .

testing

새로운 메서드 T.Context B.Context테스트가 완료되고 테스트 정리 기능이 실행되기 전에 취소된 컨텍스트를 반환합니다.

새로운 메서드 T.Chdir B.Chdir메서드를 사용하면 테스트나 벤치마크 동안 작업 디렉토리를 변경할 수 있습니다.

text/template

이제 템플릿은 range-over-func와 range-over-int를 지원합니다.

time

Time이제 encoding.BinaryAppender encoding.TextAppender인터페이스를 구현합니다.

포트 

리눅스 

Go 1.23 릴리스 노트에 발표된 대로 , Go 1.24에는 Linux 커널 버전 3.2 이상이 필요합니다.

다윈 

Go 1.24는 macOS 11 Big Sur에서 실행되는 마지막 릴리스입니다. Go 1.25에는 macOS 12 Monterey 이상이 필요합니다.

웹어셈블리 

Go 프로그램이 함수를 WebAssembly 호스트로 내보낼 수 있도록 go:wasmexport 컴파일러 지시어가 추가되었습니다.

WebAssembly System Interface Preview 1 (GOOS=wasip1 GOARCH=wasm)에서 Go 1.24는 -buildmode=c-shared 빌드 플래그를 지정하여 Go 프로그램을 reactor/library로 빌드하는 것을 지원합니다.

이제 더 많은 유형이 go:wasmimport 함수의 인자 또는 결과 유형으로 허용됩니다. 특히, 32비트 및 64비트 정수 및 부동 소수점 유형과 이미 허용된 unsafe.Pointer와 함께 bool, string, uintptr 및 특정 유형의 포인터가 허용됩니다 (자세한 내용은 설명서 참조). 이러한 유형은 go:wasmexport 함수의 인자 또는 결과 유형으로도 허용됩니다.

WebAssembly에 대한 지원 파일이 misc/wasm에서 lib/wasm으로 이동했습니다.

윈도우 

32비트 windows/arm 포트(GOOS=windows GOARCH=arm)는 더 이상 지원되지 않습니다 (broken으로 표시됨). 자세한 내용은 이슈 #70705를 참조하세요.

 

 

반응형

+ Recent posts