Go1.24のリリースノート(日本語訳)

JavaScriptを有効にしてください

前書き

Go 1.24 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.24 Release Notes

前のバージョン:Go1.23のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報

Go 1.24の紹介

最新のGoリリースであるバージョン1.24は、Go 1.23から6ヶ月後に登場しました。変更のほとんどはツールチェーン、ランタイム、ライブラリの実装にあります。いつものように、このリリースはGo 1の互換性の約束を維持しています。ほとんどすべてのGoプログラムがこれまで通りにコンパイルおよび実行されることを期待しています。

言語の変更

Go 1.24では、ジェネリック型エイリアス を完全にサポートします。型エイリアスは、定義された型のようにパラメータ化できます。詳細は言語仕様を参照してください。現在、この機能はGOEXPERIMENT=noaliastypeparamsを設定することで無効にできますが、aliastypeparams設定はGo 1.25で削除されます。

ツール

Goコマンド

Goモジュールは、go.mod内のツールディレクティブを使用して実行可能な依存関係を追跡できるようになりました。これにより、従来の「tools.go」と名付けられたファイルにツールを空のインポートとして追加する必要がなくなります。goツールコマンドは、Goディストリビューションに同梱されているツールに加えて、これらのツールを実行できるようになりました。詳細はドキュメント を参照してください。

go getの新しい-toolフラグは、requireディレクティブを追加するだけでなく、名前付きパッケージのために現在のモジュールにツールディレクティブを追加します。

新しいツールメタパターン は、現在のモジュール内のすべてのツールを指します。これを使用して、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で報告するようになりました。これらは新しいアクションタイプによって区別されますが、テスト統合システムで問題を引き起こす場合は、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 関数への呼び出しをコンパイルしません。
たとえば、fvoid f(int)void f(double) の両方で宣言されている場合、f(0) に対して誤った呼び出しシーケンスを生成する可能性がある代わりに、cgo はエラーを報告します。

このリリースでは、新たに、互換性のない宣言が異なるファイルに存在する場合でも、このエラー条件をより適切に検出できるようになりました。詳細は #67699 を参照してください。

Objdump

objdumpツール は、64ビットLoongArch (GOARCH=loong64)、RISC-V (GOARCH=riscv64)、およびS390X (GOARCH=s390x)での逆アセンブリをサポートするようになりました。

Vet

新しいテストアナライザーは、テストパッケージ内のテスト、ファザー、ベンチマーク、および例の宣言における一般的な間違いを報告します。これには、名前の誤り、署名の誤り、または存在しない識別子を文書化する例が含まれます。これらの間違いのいくつかは、テストが実行されない原因となる可能性があります。このアナライザーは、go testによって実行されるアナライザーのサブセットの一部です。

既存の printf アナライザーは、fmt.Printf(s) の形式での呼び出しに対して診断を報告するようになりました。ここで s は非定数のフォーマット文字列であり、他に引数がない場合を指します。

このような呼び出しは、s% 記号が含まれている可能性があるため、ほぼ確実に誤りです。その場合は、fmt.Print を使用するべきです。詳細は #60529 を参照してください。

このチェックは、既存のコードに影響を与える可能性があるため、適用されるのは 言語バージョンが Go 1.24 以上の場合 のみです(go.modgo 指定や //go:build コメントによる指定)。これにより、Go 1.24 のツールチェーンへ更新する際に継続的インテグレーション(CI)の失敗を防ぐことができます。

既存の buildtag アナライザーは、//go:build ディレクティブ内に無効な Go のメジャーバージョンのビルド制約 がある場合に診断を報告するようになりました。

たとえば、//go:build go1.23.1 はポイントリリースを指定しており、正しくは //go:build go1.23 を使用する必要があります。

詳細は #64127 を参照してください。

既存の copylock アナライザーは、次のような 3 句の “for” ループ で宣言された変数が sync.Locker(例えば sync.Mutex)を含む場合に診断を報告するようになりました。

go
1
for i := iter(); done(i); i = next(i) { ... }

Go 1.22 では、これらのループの動作が変更され、各イテレーションごとに新しい変数が作成され、前のイテレーションの値がコピーされるようになりました。しかし、このコピー操作はロックに対して安全ではありません。

詳細は #66387 を参照してください。

GOCACHEPROG

cmd/go内部バイナリおよびテストキャッシュメカニズムは、cmd/goツールとGOCACHEPROG環境変数で指定された子プロセス間のJSONプロトコルを実装する子プロセスによって実装できるようになりました。これは以前はGOEXPERIMENTの背後にありました。プロトコルの詳細については、ドキュメント を参照してください。

ランタイム

ランタイムのいくつかのパフォーマンス改善により、代表的なベンチマークスイート全体でCPUオーバーヘッドが平均2〜3%減少しました。結果はアプリケーションによって異なる場合があります。これらの改善には、スイステーブル に基づく新しい組み込みマップ実装、小さなオブジェクトのより効率的なメモリアロケーション、および新しいランタイム内部ミューテックス実装が含まれます。

新しい組み込みマップ実装と新しいランタイム内部ミューテックスは、それぞれ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進値で上書きできます。

Bootstrap

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.Openos.Root.Createos.Root.Mkdir 、およびos.Root.Stat などです。

新しいベンチマーク関数

ベンチマークは、従来の b.N を使用したループ構造(for range b.N など)の代わりに、より高速でエラーを起こしにくい testing.B.Loop メソッド を使用できるようになりました。例えば、以下のように記述できます。

go
1
for b.Loop() { ... }

この変更には、2つの重要な利点があります。

  1. ベンチマーク関数が -count ごとに正確に1回実行される
    そのため、高価なセットアップやクリーンアップ処理が1回だけ実行されます。

  2. 関数の呼び出しパラメータや戻り値が保持される
    これにより、コンパイラがループ本体を完全に最適化して消してしまうことを防ぐことができます。

改善されたファイナライザ

新しいruntime.AddCleanup関数 は、runtime.SetFinalizer よりも柔軟で効率的でエラーが少ないファイナライゼーションメカニズムです。AddCleanupは、オブジェクトが到達不能になったときに実行されるクリーンアップ関数をオブジェクトにアタッチします。ただし、SetFinalizerとは異なり、複数のクリーンアップを単一のオブジェクトにアタッチでき、内部ポインタにクリーンアップをアタッチでき、オブジェクトがサイクルを形成する場合でも一般的にリークを引き起こさず、オブジェクトまたはそれが指すオブジェクトの解放を遅らせません。新しいコードでは、SetFinalizerよりもAddCleanupを優先するべきです。

新しいweakパッケージ

新しいweakパッケージ は、弱参照ポインタを提供します。

弱参照ポインタは、値の関連付けのための弱いマップ、package 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パッケージ

新しい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には、現在CMVP認定ラボでテスト中のGo Cryptographic Moduleバージョンv1.0.0が含まれています。

新しい実験的なtesting/synctestパッケージ

新しい実験的なtesting/synctestパッケージ は、並行コードのテストをサポートします。

synctest.Run関数 は、孤立した「バブル」でゴルーチンのグループを開始します。バブル内では、timeパッケージの関数がフェイククロックで動作します。
synctest.Wait関数 は、現在のバブル内のすべてのゴルーチンがブロックするのを待ちます。
詳細については、パッケージドキュメントを参照してください。

synctestパッケージは実験的であり、ビルド時にGOEXPERIMENT=synctestを設定することで有効にする必要があります。パッケージAPIは将来のリリースで変更される可能性があります。詳細およびフィードバックの提供については、issue #67434 を参照してください。

ライブラリの小さな変更

archive

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 によって返されるストリーム 実装は、amd64およびarm64で数倍高速になりました。

NewOFBNewCFBEncrypter 、およびNewCFBDecrypter は非推奨になりました。OFBおよびCFBモードは認証されておらず、一般的にアクティブな攻撃によって平文を操作および回復することができます。アプリケーションはAEADモードを使用することをお勧めします。認証されていないストリームモードが必要な場合は、代わりにNewCTRを使用してください。

crypto/ecdsa

PrivateKey.Sign は、ランダムソースがnilの場合、RFC 6979 に従って決定的な署名を生成するようになりました。

crypto/md5

md5.New によって返される値は、encoding.BinaryAppender インターフェースも実装するようになりました。

crypto/rand

Read関数 は、もはや失敗しないことが保証されています。常にnilをエラー結果として返します。ReadがReader から読み取る際にエラーが発生した場合、プログラムは回復不能なクラッシュを引き起こします。デフォルトのReaderが使用するプラットフォームAPIは常に成功すると文書化されているため、この変更はReader変数をオーバーライドするプログラムにのみ影響を与えるはずです。例外は、デフォルトのReaderが/dev/urandomを開くLinuxカーネルバージョン3.17以前です。

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.PrecomputePrivateKey.Validate の前に呼び出すことが安全で効率的になりました。Precomputeは、JSONからキーをアンマーシャルする場合など、部分的に埋められたPrecomputedValues が存在する場合に高速になりました。

パッケージは、Validateが呼び出されていない場合でも、より多くの無効なキーを拒否するようになり、GenerateKey は壊れたランダムソースに対して新しいエラーを返す可能性があります。PrivateKeyPrimes およびPrecomputed フィールドは、一部の値が欠落している場合でも使用および検証されるようになりました。以下のcrypto/x509のRSAキーの解析 およびマーシャリングの変更も参照してください。

SignPKCS1v15 およびVerifyPKCS1v15 は、SHA-512/224、SHA-512/256、およびSHA-3をサポートするようになりました。

GenerateKey は、プライベート指数を生成するためにわずかに異なる方法(オイラーのトーシェントの代わりにカーマイケルのトーシェント)を使用するようになりました。プライムファクターのみから外部でキーを再生成するまれなアプリケーションは、異なるが互換性のある結果を生成する可能性があります。

公開および秘密鍵操作は、wasmで最大2倍高速になりました。

crypto/sha1

sha1.New によって返される値は、encoding.BinaryAppender インターフェースも実装するようになりました。

crypto/sha256

sha256.New およびsha256.New224 によって返される値は、encoding.BinaryAppender インターフェースも実装するようになりました。

crypto/sha512

sha512.Newsha512.New384sha512.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サーバーは、暗号化されたクライアントHello(ECH)をサポートするようになりました。この機能は、Config.EncryptedClientHelloKeys フィールドを埋めることで有効にできます。

新しいポスト量子X25519MLKEM768 鍵交換メカニズムがサポートされ、Config.CurvePreferences がnilの場合にデフォルトで有効になっています。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 は、テンプレートにnilのCertificate.SerialNumber フィールドが渡された場合、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(実行可能およびリンク可能な形式)ファイルでのシンボルバージョンの処理をサポートするようになりました。新しいFile.DynamicVersions メソッドは、ELFファイルで定義された動的バージョンのリストを返します。新しいFile.DynamicVersionNeeds メソッドは、このELFファイルが他のELFオブジェクトで定義された動的バージョンを必要とするリストを返します。最後に、新しいSymbol.HasVersion およびSymbol.VersionIndex フィールドは、シンボルのバージョンを示します。

encoding

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データ構造は、イテレータを返すメソッドも持つようになり、次のようなコードを簡素化できます:

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

次のように:

go
1
2
3
for param := range fn.Signature().Params().Variables() {
   use(param)
}

メソッドは次のとおりです:Interface.EmbeddedTypesInterface.ExplicitMethodsInterface.MethodsMethodSet.MethodsNamed.MethodsScope.ChildrenStruct.FieldsTuple.VariablesTypeList.TypesTypeParamList.TypeParamsUnion.Terms

hash/adler32

New によって返される値は、encoding.BinaryAppender インターフェースも実装するようになりました。

hash/crc32

New およびNewIEEE によって返される値は、encoding.BinaryAppender インターフェースも実装するようになりました。

hash/crc64

New によって返される値は、encoding.BinaryAppender インターフェースも実装するようになりました。

hash/fnv

New32New32aNew64New64aNew128 およびNew128a によって返される値は、encoding.BinaryAppender インターフェースも実装するようになりました。

hash/maphash

新しいComparable およびWriteComparable 関数は、任意の比較可能な値のハッシュを計算できます。これにより、Goマップキーとして使用できるものをハッシュすることが可能になります。

log/slog

新しいDiscardHandler は、決して有効にならず、常にその出力を破棄するハンドラです。

Level およびLevelVar は、encoding.TextAppender インターフェースを実装するようになりました。

math/big

FloatInt および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

リクエストに対して受信した1xx情報応答のTransport の制限が変更されました。以前は、5つ以上の1xx応答を受信した後にリクエストを中止し、エラーを返していました。現在は、すべての1xx応答の合計サイズがTransport.MaxResponseHeaderBytes 構成設定を超えた場合にエラーを返します。

さらに、リクエストにnet/http/httptrace.ClientTrace.Got1xxResponse トレースフックがある場合、1xx応答の総数に制限はありません。Got1xxResponseフックは、リクエストを中止するためにエラーを返すことができます。

Transport およびServer には、HTTP/2プロトコル設定を構成するためのHTTP2フィールドが追加されました。

新しい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サポートは、「Prior Knowledgeを持つHTTP/2」(RFC 9113、セクション3.3)を使用します。非推奨の「Upgrade: h2c」ヘッダーはサポートされていません。

net/netip

AddrAddrPort およびPrefix は、encoding.BinaryAppender およびencoding.TextAppender インターフェースを実装するようになりました。

net/url

URL は、encoding.BinaryAppender インターフェースも実装するようになりました。

os/user

Windowsでは、Current はWindows Nano Serverで使用できるようになりました。実装は、Nano Serverで利用できないNetApi32ライブラリの関数を使用しないように更新されました。

Windowsでは、CurrentLookup およびLookupId は、次の組み込みサービスユーザーアカウントをサポートするようになりました:

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

Windowsでは、Current は、現在のユーザーが遅いドメインに参加している場合に、はるかに高速になりました。これは、多くの企業ユーザーにとって通常のケースです。新しい実装のパフォーマンスは、以前の実装が完了するのに数秒、さらには数分かかる可能性があったのに対し、ミリ秒単位のオーダーになりました。

Windowsでは、Current は、現在のスレッドが別のユーザーを偽装している場合に、プロセス所有者ユーザーを返すようになりました。以前はエラーを返していました。

regexp

Regexp は、encoding.TextAppender インターフェースを実装するようになりました。

runtime

GOROOT 関数は非推奨になりました。新しいコードでは、システムパスを使用して「go」バイナリを見つけ、go env GOROOTを使用してそのGOROOTを見つけることをお勧めします。

strings

stringsパッケージは、イテレータを使用するいくつかの関数を追加しました:

  • Lines は、文字列内の改行で終わる行のイテレータを返します。
  • SplitSeq は、セパレータの周りで分割された文字列のすべてのサブストリングのイテレータを返します。
  • SplitAfterSeq は、セパレータの各インスタンスの後で分割された文字列のサブストリングのイテレータを返します。
  • FieldsSeq は、unicode.IsSpace で定義された空白文字のランの周りで分割された文字列のサブストリングのイテレータを返します。
  • FieldsFuncSeq は、述語を満たすUnicodeコードポイントのランの周りで分割された文字列のサブストリングのイテレータを返します。

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 インターフェースを実装するようになりました。

ポート

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に移動されました。

Windows

32ビットのwindows/armポート(GOOS=windows GOARCH=arm)は壊れているとマークされました。詳細については、issue #70705 を参照してください。


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア