Go 1.24 リリースノート
Go 1.24 の紹介
最新の Go リリースであるバージョン 1.24 は、Go 1.23 の6ヶ月後の2025年2月に登場します。変更点のほとんどは、ツールチェイン、ランタイム、およびライブラリの実装にあります。これまで通り、このリリースは Go 1 の互換性の約束を維持しています。ほとんどすべての Go プログラムはこれまで通りコンパイルおよび実行されると予想されます。
言語の変更点
Go 1.24 はジェネリック型エイリアスを完全にサポートするようになりました。型エイリアスは、定義された型のようにパラメータ化できます。詳細については、言語仕様を参照してください。現在のところ、この機能はGOEXPERIMENT=noaliastypeparamsを設定することで無効にできますが、aliastypeparams設定は Go 1.25 で削除されます。
ツール
Go コマンド
Go モジュールは、go.mod の tool ディレクティブを使用して実行可能依存関係を追跡できるようになりました。これにより、慣例的に "tools.go" と名付けられたファイルにツールをブランクインポートとして追加するという以前の回避策は不要になります。go tool コマンドは、Go ディストリビューションに同梱されているツールに加えて、これらのツールも実行できるようになりました。詳細については、ドキュメントを参照してください。
go get の新しい -tool フラグは、指定されたパッケージに対して require ディレクティブを追加するだけでなく、現在のモジュールに tool ディレクティブを追加します。
新しい 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 アナライザーは、非定数フォーマット文字列 s を持ち、他の引数がない fmt.Printf(s) の形式の呼び出しについて診断を報告するようになりました。このような呼び出しは、s の値に % 記号が含まれる可能性があるため、ほとんどの場合間違いです。代わりに fmt.Print を使用してください。#60529 を参照してください。このチェックは既存のコードで結果を生成する傾向があるため、Go 1.24 Go ツールチェインに更新する際に継続的インテグレーションの失敗を引き起こさないように、言語バージョン (go.mod の go ディレクティブまたは //go:build コメントで指定) が Go 1.24 以上の場合にのみ適用されます。
既存の 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 内部バイナリおよびテストキャッシュメカニズムは、cmd/go ツールと GOCACHEPROG 環境変数で指定された子プロセスの間で JSON プロトコルを実装する子プロセスによって実装できるようになりました。これは以前は GOEXPERIMENT の背後にありました。プロトコルの詳細については、ドキュメントを参照してください。
ランタイム
ランタイムに対するいくつかのパフォーマンス改善により、代表的なベンチマークスイート全体で平均して CPU オーバーヘッドが 2〜3% 減少しました。結果はアプリケーションによって異なる場合があります。これらの改善には、Swiss Tables に基づく新しい組み込み map 実装、小オブジェクトのより効率的なメモリ割り当て、および新しいランタイム内部ミューテックス実装が含まれます。
新しい組み込み map 実装と新しいランタイム内部ミューテックスは、ビルド時にそれぞれ GOEXPERIMENT=noswissmap と GOEXPERIMENT=nospinbitmutex を設定することで無効にできます。
コンパイラ
コンパイラはすでに、cgo 生成されたレシーバー型で新しいメソッドを定義することを禁止していましたが、エイリアス型を介してその制限を回避することが可能でした。Go 1.24 は、レシーバーが直接的または間接的 (エイリアス型を介して) に cgo 生成された型を示す場合、常にエラーを報告するようになりました。
リンカ
リンカは、デフォルトで ELF プラットフォームでは GNU ビルド ID (ELF NT_GNU_BUILD_ID ノート) を、macOS では UUID (Mach-O LC_UUID ロードコマンド) を生成するようになりました。ビルド ID または UUID は Go ビルド ID から派生します。これは -B none リンカフラグで無効にしたり、-B 0xNNNN リンカフラグとユーザー指定の16進値で上書きしたりできます。
ブートストラップ
Go 1.22 リリースノートで述べたように、Go 1.24 はブートストラップに Go 1.22.6 以降を必要とします。Go 1.26 はブートストラップに Go 1.24 以降のポイントリリースを必要とすると予想されます。
標準ライブラリ
ディレクトリ制限付きファイルシステムアクセス
新しい os.Root 型は、特定のディレクトリ内でファイルシステム操作を実行する機能を提供します。
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 のような典型的なループ構造の代わりに、より高速でエラーが発生しにくい testing.B.Loop メソッド (for b.Loop() { ... } のように) を使用してベンチマークイテレーションを実行できるようになりました。これには2つの大きな利点があります
- ベンチマーク関数は -count ごとに正確に一度だけ実行されるため、コストのかかるセットアップとクリーンアップのステップは一度だけ実行されます。
- 関数呼び出しのパラメータと結果は生存状態に保たれ、コンパイラがループ本体を完全に最適化するのを防ぎます。
改善されたファイナライザー
新しい runtime.AddCleanup 関数は、runtime.SetFinalizer よりも柔軟で効率的でエラーが発生しにくいファイナライゼーションメカニズムです。AddCleanup は、オブジェクトにクリーンアップ関数をアタッチし、そのオブジェクトが到達不能になったときに実行されます。ただし、SetFinalizer とは異なり、複数のクリーンアップを単一のオブジェクトにアタッチでき、クリーンアップを内部ポインタにアタッチでき、オブジェクトがサイクルを形成してもクリーンアップは通常リークを引き起こさず、クリーンアップはオブジェクトまたはそれが指すオブジェクトの解放を遅らせません。新しいコードでは SetFinalizer よりも AddCleanup を推奨します。
新しい weak パッケージ
新しい weak パッケージは弱ポインタを提供します。
弱ポインタは、値の関連付けのための弱マップ、unique パッケージでカバーされないあらゆるもののための正規化マップ、およびさまざまな種類のキャッシュなど、メモリ効率の良い構造の作成を可能にするために提供される低レベルのプリミティブです。これらのユースケースをサポートするために、このリリースでは runtime.AddCleanup および maphash.Comparable も提供します。
新しい crypto/mlkem パッケージ
新しい crypto/mlkem パッケージは ML-KEM-768 および ML-KEM-1024 を実装します。
ML-KEM は、以前は Kyber として知られており、FIPS 203 で指定された、ポスト量子鍵交換メカニズムです。
新しい crypto/hkdf、crypto/pbkdf2、および crypto/sha3 パッケージ
新しい crypto/hkdf パッケージは、RFC 5869 で定義されている HMAC ベースの抽出および拡張鍵導出関数 HKDF を実装します。
新しい crypto/pbkdf2 パッケージは、RFC 8018 で定義されているパスワードベースの鍵導出関数 PBKDF2 を実装します。
新しい crypto/sha3 パッケージは、FIPS 202 で定義されている SHA-3 ハッシュ関数と SHAKE および cSHAKE 拡張可能出力関数を実装します。
これら3つのパッケージはすべて、既存の 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 には Go Cryptographic Module バージョン v1.0.0 が含まれており、現在 CMVP 認定ラボでテスト中です。
新しい実験的な testing/synctest パッケージ
新しい実験的な testing/synctest パッケージは、並行コードのテストをサポートします。
synctest.Run関数は、孤立した「バブル」内でゴルーチンのグループを開始します。バブル内では、timeパッケージ関数が偽のクロック上で動作します。synctest.Wait関数は、現在のバブル内のすべてのゴルーチンがブロックするのを待ちます。
詳細については、パッケージドキュメントを参照してください。
synctest パッケージは実験的であり、ビルド時に GOEXPERIMENT=synctest を設定することで有効にする必要があります。パッケージ API は将来のリリースで変更される可能性があります。詳細およびフィードバックの提供については、issue #67434 を参照してください。
ライブラリの軽微な変更
アーカイブ
archive/zip と archive/tar の両方における (*Writer).AddFS 実装は、空のディレクトリのディレクトリヘッダを書き込むようになりました。
bytes
bytes パッケージはイテレータを扱ういくつかの関数を追加します
Linesは、バイトスライス内の改行で区切られた行のイテレータを返します。SplitSeqは、セパレータを中心に分割されたバイトスライスのすべてのサブスライスのイテレータを返します。SplitAfterSeqは、セパレータの各インスタンスの後で分割されたバイトスライスのサブスライスのイテレータを返します。FieldsSeqは、unicode.IsSpaceで定義されている空白文字の連続で分割されたバイトスライスのサブスライスのイテレータを返します。FieldsFuncSeqは、述語を満たす Unicode コードポイントの連続で分割されたバイトスライスのサブスライスのイテレータを返します。
crypto/aes
NewCipher が返す値は、NewCTR、NewGCM、NewCBCEncrypter、および NewCBCDecrypter メソッドを実装しなくなりました。これらのメソッドは文書化されておらず、すべてのアーキテクチャで利用できるわけではありませんでした。代わりに、Block の値を関連する crypto/cipher 関数に直接渡すべきです。現在のところ、crypto/cipher は、標準ライブラリでは使用されなくなったとしても、Block 値上のこれらのメソッドをまだチェックします。
crypto/cipher
新しい NewGCMWithRandomNonce 関数は、Seal 中にランダムなノンスを生成し、それを暗号テキストの前に付加することで AES-GCM を実装する AEAD を返します。
crypto/aes とともに使用される場合に NewCTR が返す Stream 実装は、amd64 および arm64 で数倍高速になりました。
NewOFB、NewCFBEncrypter、および NewCFBDecrypter は非推奨になりました。OFB および CFB モードは認証されていないため、一般的にアクティブな攻撃によって平文が操作および回復される可能性があります。アプリケーションでは代わりに AEAD モードを使用することを推奨します。認証されていない Stream モードが必要な場合は、代わりに NewCTR を使用してください。
crypto/ecdsa
乱数ソースが nil の場合、PrivateKey.Sign は 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 は、プライベート指数を生成するためにわずかに異なる方法 (オイラーのトーシェントではなくカーマイケルのトーシェント) を使用するようになりました。素因数からのみ外部でキーを再生成するまれなアプリケーションでは、異なるが互換性のある結果が生成される可能性があります。
WebAssembly では、公開鍵と秘密鍵の操作が最大2倍高速になりました。
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 レベルの機能によって最適化されないようにするために使用できます。現在、WithDataIndependentTiming は arm64 の PSTATE.DIT ビットを使用し、他のすべてのアーキテクチャでは何もしません。GODEBUG 設定 dataindependenttiming=1 は、Go プログラム全体で DIT モードを有効にします。
XORBytes の出力は、入力と完全に重複するか、まったく重複しない必要があります。以前は動作が未定義でしたが、現在は XORBytes はパニックを起こします。
crypto/tls
TLS サーバーは Encrypted Client Hello (ECH) をサポートするようになりました。この機能は、Config.EncryptedClientHelloKeys フィールドに値を設定することで有効にできます。
新しいポスト量子 X25519MLKEM768 鍵交換メカニズムがサポートされ、Config.CurvePreferences が nil の場合にデフォルトで有効になります。GODEBUG 設定 tlsmlkem=0 はデフォルトを元に戻します。これは、大きなレコードを正しく処理できず、ハンドシェイク中にタイムアウトを引き起こすバグのある TLS サーバーに対処する場合に役立ちます (TLS post-quantum TL;DR fail を参照)。
実験的な X25519Kyber768Draft00 鍵交換のサポートは削除されました。
鍵交換の順序は、crypto/tls パッケージによって完全に処理されるようになりました。Config.CurvePreferences の順序は無視され、その内容はフィールドが設定されている場合にどの鍵交換を有効にするかを決定するためにのみ使用されます。
新しい ClientHelloInfo.Extensions フィールドは、Client 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 フィールドは、シンボルのバージョンを示します。
エンコーディング
2つの新しいインターフェース、TextAppender と BinaryAppender が導入され、オブジェクトのテキスト表現またはバイナリ表現をバイトスライスに追記できるようになりました。これらのインターフェースは TextMarshaler と BinaryMarshaler と同じ機能を提供しますが、毎回新しいスライスを割り当てるのではなく、既存のスライスにデータを直接追記します。これらのインターフェースは、TextMarshaler および/または BinaryMarshaler をすでに実装している標準ライブラリ型によって実装されるようになりました。
encoding/json
マーシャリング時、構造体フィールドタグに新しい omitzero オプションを持つ構造体フィールドは、その値がゼロである場合に省略されます。フィールド型に IsZero() bool メソッドがある場合、それが値がゼロであるかどうかを判断するために使用されます。そうでない場合、値はその型のゼロ値である場合にゼロです。omitzero フィールドタグは、ゼロ値を省略する意図がある場合に omitempty よりも明確でエラーが発生しにくいです。特に、omitempty とは異なり、omitzero はゼロ値の time.Time 値を省略します。これは一般的な摩擦の原因です。
omitempty と omitzero の両方が指定されている場合、値が空であるかゼロであるか(またはその両方)の場合にフィールドは省略されます。
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 と Server に HTTP2 フィールドが追加され、HTTP/2 プロトコル設定を構成できるようになりました。
新しい Server.Protocols および Transport.Protocols フィールドは、サーバーまたはクライアントが使用する HTTP プロトコルを構成する簡単な方法を提供します。
サーバーとクライアントは、暗号化されていない HTTP/2 接続をサポートするように構成できます。
Server.Protocols に UnencryptedHTTP2 が含まれている場合、サーバーは暗号化されていないポートで HTTP/2 接続を受け入れます。サーバーは、同じポートで HTTP/1 と暗号化されていない HTTP/2 の両方を受け入れることができます。
Transport.Protocols に UnencryptedHTTP2 が含まれており、HTTP1 が含まれていない場合、トランスポートは http:// URL に暗号化されていない HTTP/2 を使用します。トランスポートが HTTP/1 と暗号化されていない HTTP/2 の両方を使用するように構成されている場合、HTTP/1 を使用します。
暗号化されていない HTTP/2 のサポートは、「事前の知識による HTTP/2」(RFC 9113, セクション 3.3) を使用します。非推奨の「Upgrade: 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、Lookup、および LookupId は、以下の組み込みサービスユーザーアカウントをサポートするようになりました
NT AUTHORITY\SYSTEMNT AUTHORITY\LOCAL SERVICENT AUTHORITY\NETWORK SERVICE
Windows では、現在のユーザーが低速ドメインに参加している場合 (多くの企業ユーザーにとっては通常の場合)、Current の実行が大幅に高速化されました。新しい実装のパフォーマンスはミリ秒単位となり、以前の実装では数秒、あるいは数分かかっていたのと比較して改善されました。
Windows では、現在のスレッドが別のユーザーを偽装している場合、Current はプロセスの所有者ユーザーを返すようになりました。以前はエラーを返していました。
regexp
Regexp は、encoding.TextAppender インターフェースを実装するようになりました。
runtime
GOROOT 関数は非推奨になりました。新しいコードでは、"go" バイナリを見つけるためにシステムパスを使用し、その GOROOT を見つけるために go env GOROOT を使用することを推奨します。
strings
strings パッケージはイテレータを扱ういくつかの関数を追加します
Linesは、文字列内の改行で区切られた行のイテレータを返します。SplitSeqは、セパレータを中心に分割された文字列のすべてのサブ文字列のイテレータを返します。SplitAfterSeqは、セパレータの各インスタンスの後で分割された文字列のサブ文字列のイテレータを返します。FieldsSeqは、unicode.IsSpaceで定義されている空白文字の連続で分割された文字列のサブ文字列のイテレータを返します。FieldsFuncSeqは、述語を満たす Unicode コードポイントの連続で分割された文字列のサブ文字列のイテレータを返します。
sync
sync.Map の実装が変更され、特にマップの変更時のパフォーマンスが向上しました。たとえば、互いに素なキーセットの変更は、大きなマップでの競合がはるかに少なくなり、マップからの低競合負荷を達成するために必要なウォームアップ時間はなくなりました。
問題が発生した場合は、ビルド時に GOEXPERIMENT=nosynchashtriemap を設定して古い実装に戻し、問題を報告してください。
testing
新しい T.Context および T.Chdir および B.Chdir メソッドは、テストまたはベンチマークの期間中、作業ディレクトリを変更するために使用できます。
text/template
テンプレートは、range-over-func と range-over-int をサポートするようになりました。
時間
Time は、encoding.BinaryAppender および encoding.TextAppender インターフェースを実装するようになりました。
ポート
Linux
Go 1.23 リリースノートで発表された通り、Go 1.24 は Linux カーネルバージョン 3.2 以降を必要とします。
Darwin
Go 1.24 は、macOS 11 Big Sur で動作する最後のリリースです。Go 1.25 は macOS 12 Monterey 以降を必要とします。
WebAssembly
Go プログラムが WebAssembly ホストに機能をエクスポートするための go:wasmexport コンパイラディレクティブが追加されました。
WebAssembly System Interface Preview 1 (GOOS=wasip1 GOARCH=wasm) では、Go 1.24 は -buildmode=c-shared ビルドフラグを指定することで、Go プログラムを リアクター/ライブラリ としてビルドすることをサポートしています。
go:wasmimport 関数の引数または結果型として、より多くの型が許可されるようになりました。具体的には、bool、string、uintptr、および特定の型へのポインタが許可されます(詳細はドキュメントを参照)。これらはすでに許可されている32ビットおよび64ビットの整数型と浮動小数点型、および unsafe.Pointer とともに使用できます。これらの型は go:wasmexport 関数の引数または結果型としても許可されます。
WebAssembly のサポートファイルは、misc/wasm から lib/wasm に移動されました。
初期メモリサイズが大幅に削減されました。特に小さな WebAssembly アプリケーションの場合。
Windows
32ビット windows/arm ポート (GOOS=windows GOARCH=arm) は破損としてマークされました。詳細は issue #70705 を参照してください。