前書き
Go1.21のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.21 Release Notes
Go 1.21の紹介
最新のGoリリースであるバージョン1.21が、前回のGo 1.20から6ヶ月後に登場しました。
このリリースの主な変更点は、ツールチェイン、ランタイム、およびライブラリの実装にあります。
従来通り、リリースではGo 1の互換性の約束が維持されており、Go 1.21ではさらにその約束が強化されています。
ほとんどのGoプログラムがこれまで通りコンパイルおよび実行できることを期待しています。
Go 1.21では、リリース番号の付け方に小さな変更が加えられました。
これまでは、Go 1.Nという形式を使用してGo言語のバージョンとリリースファミリー、またそのファミリー内の最初のリリースの両方を指していました。
Go 1.21からは、最初のリリースがGo 1.N.0という形式になります。
本日リリースされるのはGo 1.21言語とその初期実装であるGo 1.21.0です。
本リリースノートでは「Go 1.21」と記載していますが、go version
のようなツールでは「go1.21.0」と表示されます(Go 1.21.1にアップグレードするまで)。
新しいバージョン番号の詳細は「Go Toolchains」ドキュメントの「Goバージョン
」を参照してください。
言語の変更
Go 1.21では、言語に3つの新しいビルトインが追加されました。
- 新しい関数minとmaxは、指定された複数の引数の中で最小値または最大値を計算します。詳細は言語仕様 を参照してください。
- 新しい関数clearは、マップからすべての要素を削除するか、スライスのすべての要素をゼロにします。詳細は言語仕様 を参照してください。
- パッケージの初期化順序がより厳密に指定されるようになりました。
パッケージの初期化順序のアルゴリズム
- すべてのパッケージをインポートパスでソートします。
- パッケージリストが空になるまで繰り返します:
- すべてのインポートがすでに初期化されている最初のパッケージを見つけます。
- そのパッケージを初期化し、リストから削除します。
この変更により、明示的なインポートで表現されていない特定の初期化順序に依存するプログラムの動作が変わる可能性があります。
そのようなプログラムの動作はこれまでのリリースで仕様によって明確に定義されていませんでした。新しいルールは一貫性のある定義を提供します。
型推論の改良
型推論の能力と精度を高める複数の改良が行われました。
- 部分的にインスタンス化されたジェネリック関数を含む関数は、部分的にインスタンス化されたジェネリック関数を引数として持つことが可能になりました。コンパイラは、呼び出される関数の欠落した型引数を推論し、引数として渡されるジェネリック関数に欠けている型引数も推論します。典型的な使用例として、スライスの操作を行うジェネリック関数の呼び出し(例:
slices.IndexFunc
)があり、関数引数もジェネリックで、呼び出される関数の型引数とその引数がコンテナ型から推論されます。より一般的には、ジェネリック関数は、型引数が割り当てや戻り値から推論される場合に明示的なインスタンス化なしで使用することが可能になりました。 - 型推論は、値がインターフェースに割り当てられる際にメソッドを考慮するようになりました。メソッドシグネチャで使用される型パラメータの型引数は、対応するメソッドのパラメータ型から推論されます。
- 同様に、型引数は対応する制約のすべてのメソッドを実装する必要があるため、型引数と制約のメソッドが一致し、追加の型引数の推論が行われる場合があります。
- 異なる種類の複数の無名定数引数(例:無名のintと無名の浮動小数点定数)が、同じ型パラメータ型を持つパラメータに渡される場合、エラーの代わりに、型推論は定数式の演算子に使用されるのと同じアプローチを使用して型を決定します。この変更により、無名定数引数から推論される型が定数式の型と一致するようになります。
- 型推論は、割り当てにおける対応する型を一致させる際に正確になりました。構成要素の型(例:スライスの要素、関数シグネチャのパラメータ型)は、(適切な型引数を考慮して)一致するために同一である必要があります。それ以外の場合、推論は失敗します。この変更により、以前のように型推論が誤って成功して無効な割り当てが行われることがなくなり、不可能な型一致の場合に推論エラーを報告するようになりました。
これらすべての変更により、型推論がより強力になり、推論失敗が予期しやすくなります。
新しい言語変更のプレビュー
Go 1.21には、将来のGoバージョンで考慮されている言語変更のプレビューが含まれています。
それは、forループの変数をループ全体ではなく各反復ごとに独立させ、偶発的な共有バグを防ぐものです。
この言語変更の試行方法については、LoopvarExperiment wiki
ページを参照してください。
nilパニックに関する変更
Go 1.21では、ゴルーチンがパニック状態にある場合、deferされた関数によってrecoverが直接呼び出された場合に、recoverの戻り値がnilにならないことが保証されます。これを保証するために、nilインターフェース値(または無名のnil)でpanicを呼び出すと、ランタイムパニック*runtime.PanicNilError
型のパニックが発生します。
古いバージョンのGo用に書かれたプログラムをサポートするために、nilパニックは、環境変数GODEBUG=panicnil=1を設定することで再度有効化できます。この設定は、mainパッケージがgo 1.20またはそれ以前を宣言しているモジュールにあるプログラムをコンパイルする際に自動的に有効化されます。
Tools
Go 1.21では、Goツールチェインにおける後方互換性と前方互換性のサポートが改善されました。
後方互換性の改善
Go 1.21では、互換性ポリシーに従って非破壊的であるものの既存のプログラムが動作しなくなる可能性がある変更をデフォルトで制御するために、GODEBUG環境変数の使用が正式化されました(たとえば、バグ修正により依存していた誤った動作が修正される場合)。
Goはこのような動作変更を行う場合、ワークスペースのgo.work
ファイルまたはメインモジュールのgo.mod
ファイル内のgo
行に基づいて、新旧の動作を選択します。新しいツールチェインにアップグレードしても、go
行を元の(古い)Goバージョンに設定したままにしておけば、古いツールチェインの動作が保持されます。この互換性サポートにより、最新のGoツールチェインは、古いGoバージョンの最良で最も安全な実装であるべきものとされています。
詳細は「Go, Backwards Compatibility, and GODEBUG
」を参照してください。
前方互換性の改善
Go 1.21では、go.work
またはgo.mod
ファイルのgo
行を厳密な最低要件として解釈します。
たとえば、go 1.21.0
と記載されている場合、そのワークスペースまたはモジュールはGo 1.20やGo 1.21rc1では使用できません。この仕様により、後のバージョンで行われた修正に依存するプロジェクトが、古いバージョンでは使用されないようにすることができます。また、新しいGoの機能を使用するプロジェクトに対してより明確なエラーレポートが提供され、必要なGoバージョンが不足している問題が報告されるようになります。これにより、未解決のインポートや構文エラーではなく、適切なエラーが表示されます。
ツールチェイン管理の改善
新しい厳密なバージョン要件をより簡単に管理できるように、go
コマンドは、リリースに同梱されたツールチェインだけでなく、PATHに見つかった他のGoツールチェインバージョンやオンデマンドでダウンロードされたバージョンも実行できるようになりました。
go.mod
またはgo.work
のgo
行で新しいGoバージョンの最低要件が宣言されている場合、go
コマンドはそのバージョンを自動的に見つけて実行します。新しいtoolchain
ディレクティブは、使用を推奨する最低ツールチェインを設定するものであり、厳密なgo
の最低要件よりも新しい場合があります。詳細は「Go Toolchains
」を参照してください。
Go command
-pgo
ビルドフラグの変更
-pgo
ビルドフラグのデフォルト値が-pgo=auto
に設定され、コマンドラインで単一のメインパッケージのみを指定する制限が解除されました。メインパッケージのディレクトリにdefault.pgo
という名前のファイルが存在する場合、go
コマンドはそれを使用して、対応するプログラムのビルドにプロファイルガイド最適化(PGO)を有効にします。
-C dir
フラグの使用ルール
コマンドラインで-C dir
フラグを使用する場合、このフラグは最初に指定する必要があります。
新しいgo test
オプション
- 新しい
-fullpath
オプションが追加され、テストログメッセージでベース名だけでなくフルパス名を出力するようになりました。 go test -c
フラグは、複数のパッケージに対してテストバイナリを出力することをサポートします。それぞれのバイナリはpkg.test
(pkg
はパッケージ名)という名前で保存されます。ただし、複数のテストパッケージが同じ名前を持つ場合はエラーが発生します。go test -o
フラグでディレクトリを指定できるようになり、テストバイナリが現在のディレクトリではなく指定されたディレクトリに出力されるようになりました。
Cリンカのサポート改善
cgoが有効な場合に外部(C)リンカを使用する際、runtime/cgo
パッケージがGoリンカに追加の依存関係として提供されるようになりました。これにより、Cリンカによって追加されたライブラリとGoランタイムの互換性が確保されます。
Cgo
Cタイプに対するGoメソッドの宣言のエラーレポート
"C"
をインポートするファイル内で、Cタイプに対してGoメソッドを宣言しようとした場合、Goツールチェインが正確にエラーを報告するようになりました。
Runtime
スタックトレースの改善
非常に深いスタックを出力する際、ランタイムは最初の50個の(最も内側の)フレームと最後の50個の(最も外側の)フレームを表示するようになりました。それにより、特にスタックオーバーフローをデバッグする際に、再帰的なスタックがどのように始まったのかを確認しやすくなります。
Linuxでのメモリ管理の改善
Linuxプラットフォームで透過的な巨大ページ(Transparent Huge Pages)をサポートする場合、Goランタイムはヒープのどの部分が巨大ページでバックアップされるかをより明確に管理します。この変更により、次のようなメリットがあります:
- 小さなヒープでは最大50%のメモリ使用量の削減が期待されます。
- 大きなヒープでは、ヒープの密集した部分において壊れた巨大ページが減少し、CPU使用率とレイテンシが最大1%改善します。
一方、この変更の結果、Linuxの特定の問題のある設定(巨大ページ関連)を回避する処理が行われなくなり、一部のケースでメモリのオーバーヘッドが増加する可能性があります。
推奨される対策として、OSの巨大ページ設定をGCガイドに従って調整することが挙げられます。他にもいくつかの代替策があります。「max_ptes_none
」のセクションを参照してください。
ガベージコレクションの調整による性能向上
ランタイム内のガベージコレクションの調整により、アプリケーションのテールレイテンシが最大40%削減され、メモリ使用量がわずかに減少することがあります。ただし、一部のアプリケーションではスループットが少し低下する可能性があります。メモリ使用量の削減はスループットの低下に比例しており、GOGCやGOMEMLIMITの値をやや増やすことで、以前のリリースに近いスループット/メモリトレードオフを再現できます(レイテンシの影響はほとんどありません)。
CからGoへの呼び出しの高速化
Cで作成されたスレッドからGoへの呼び出しは、Go実行の準備として特定の設定が必要です。Unixプラットフォームでは、この設定が同じスレッドで複数回の呼び出し間で保持されるようになりました。これにより、CからGoへの呼び出しのオーバーヘッドが1〜3マイクロ秒から100〜200ナノ秒に大幅に削減されます。
コンパイラ
プロファイルガイド最適化(PGO)の正式サポート
Go 1.20でプレビューとして導入されたプロファイルガイド最適化(PGO)が正式に利用可能となりました。PGOは、運用ワークロードのプロファイルで「ホット」と識別されたコードに対して追加の最適化を行います。Go command
セクションで述べたように、PGOはメインパッケージディレクトリにdefault.pgo
プロファイルがある場合にデフォルトで有効になります。アプリケーションの動作に応じて性能向上は異なりますが、代表的なGoプログラムの多くが2%から7%の性能向上を示しています。詳細はPGOユーザーガイド
を参照してください。
インターフェースメソッド呼び出しのデバーチャライゼーション
PGOビルドでは、一部のインターフェースメソッド呼び出しをデバーチャライズ(仮想関数呼び出しを具体的な関数呼び出しに変換)し、最も頻繁に呼び出される具体的な関数を特定します。これにより、さらに最適化が可能になり、例えばインライン化が適用されます。
ビルド速度の向上
PGOを使用してコンパイラ自体をビルドすることで、ビルド速度が最大6%向上しました。
アセンブラ
amd64アセンブリ関数のフレーム管理の変更
amd64では、フレームレスなnosplitアセンブリ関数が自動的にNOFRAME
としてマークされなくなりました。NOFRAME
属性が必要な場合は、明示的に指定する必要があります。他のフレームポインタをサポートするアーキテクチャではすでにこの動作が採用されています。この変更により、ランタイムがスタック遷移のフレームポインタを維持します。
動的リンク時のR15の使用検証の改善
amd64における動的リンク時のR15の不正な使用を検証する仕組みが改善されました。
リンカ
Windows/amd64におけるSEHアンワインディングデータの生成
Windows/amd64で、リンカがコンパイラの支援を受けてデフォルトでSEH(構造化例外ハンドリング)アンワインディングデータを生成するようになりました。これにより、Windowsデバッガやその他のツールとのGoアプリケーションの統合が向上します。
未使用のグローバルマップ変数の削除
Go 1.21では、リンカ(コンパイラの支援を受けて)が未参照のグローバルマップ変数を削除できるようになりました。ただし、これは初期化子のエントリ数が十分に多く、かつ初期化式に副作用がない場合に限られます。
標準ライブラリ
新しいlog/slog
パッケージ
新しいlog/slog
パッケージは、レベル付きの構造化ロギングを提供します。構造化ロギングでは、大量のログデータを迅速かつ正確に処理できるように、キーと値のペアを出力します。このパッケージは、一般的なログ解析ツールやサービスとの統合をサポートしています。
新しいtesting/slogtest
パッケージ
新しいtesting/slogtest
パッケージは、slog.Handler
の実装を検証するためのツールを提供します。
新しいslices
パッケージ
新しいslices
パッケージは、スライスに対する多くの共通操作を提供します。これらは、任意の要素型のスライスで動作するジェネリック関数として実装されています。
新しいmaps
パッケージ
新しいmaps
パッケージは、マップに対するいくつかの共通操作を提供します。これらは、任意のキー型または要素型を持つマップで動作するジェネリック関数として実装されています。
新しいcmp
パッケージ
新しいcmp
パッケージは、型制約Ordered
と、新しいジェネリック関数Less
およびCompare
を定義します。これらは、順序付け可能な型での使用に便利です。
ライブラリの細かい変更
いつものように、ライブラリには様々な小さな変更や更新が加えられています。これらはすべて、Go 1の互換性の約束を考慮して行われています。また、ここには列挙されていない様々な性能改善も含まれています。
archive/tar
Header.FileInfo
によって返されるio/fs.FileInfo
インターフェースの実装が、String
メソッドを実装するようになりました。このメソッドはio/fs.FormatFileInfo
を呼び出します。
archive/zip
FileHeader.FileInfo
によって返されるio/fs.FileInfo
インターフェースの実装が、String
メソッドを実装するようになりました。このメソッドはio/fs.FormatFileInfo
を呼び出します。Reader.Open
によって返されるio/fs.File
のio/fs.ReadDirFile.ReadDir
メソッドが返すio/fs.DirEntry
インターフェースの実装が、String
メソッドを実装するようになりました。このメソッドはio/fs.FormatDirEntry
を呼び出します。
bytes
Buffer
型に新しいメソッドAvailable
とAvailableBuffer
が追加されました。これらはWrite
メソッドと併用して、直接Buffer
にデータを追加する際に使用できます。
context
- 新しい
WithoutCancel
関数は、元のコンテキストがキャンセルされてもキャンセルされないコピーを返します。 - 新しい
WithDeadlineCause
およびWithTimeoutCause
関数は、デッドラインやタイマーの期限切れ時にキャンセルの原因を設定する方法を提供します。この原因はCause
関数で取得できます。 - 新しい
AfterFunc
関数は、コンテキストがキャンセルされた後に関数を実行する登録を行います。 - 最適化により、
Background
およびTODO
を呼び出し、これらを共有型に変換した結果が等しいと見なされるようになりました。以前のリリースでは常に異なると見なされていました。
crypto/ecdsa
PublicKey.Equal
およびPrivateKey.Equal
が一定時間で実行されるようになりました。
crypto/elliptic
すべてのCurve
メソッド、およびGenerateKey
、Marshal
、Unmarshal
が非推奨となりました。ECDH操作には新しいcrypto/ecdh
パッケージを使用してください。低レベルの操作には、filippo.io/nistec
などのサードパーティモジュールを利用してください。
crypto/rand
crypto/rand
パッケージは、NetBSD 10.0以降でgetrandom
システムコールを使用するようになりました。
crypto/rsa
- プライベートRSA操作(復号および署名)の性能が、Go 1.19に比べて向上しました(GOARCH=amd64およびGOARCH=arm64の場合)。Go 1.20で性能が低下していた問題が解消されています。
PrecomputedValues
にプライベートフィールドが追加されたため、以前に計算された秘密鍵(例:JSONからデシリアライズされたもの)でも最適な性能を得るには、PrivateKey.Precompute
を呼び出す必要があります。PublicKey.Equal
およびPrivateKey.Equal
が一定時間で実行されるようになりました。GenerateMultiPrimeKey
関数およびPrecomputedValues.CRTValues
フィールドは非推奨となりました。PrivateKey.Precompute
が呼び出されるとCRTValues
は依然として設定されますが、復号操作ではこれらの値は使用されません。
crypto/sha256
SHA-224およびSHA-256の操作が、GOARCH=amd64の場合に利用可能なネイティブ命令を使用するようになりました。これにより、パフォーマンスが3〜4倍向上します。
crypto/tls
クライアント証明書の検証に関する変更
サーバーは、再開された接続においてクライアント証明書の検証をスキップするようになりました(Config.VerifyPeerCertificate
も実行されません)。ただし、有効期限の確認は引き続き行われます。これにより、クライアント証明書が使用されている場合、セッションチケットが大きくなります。クライアントはすでに接続再開時の検証をスキップしていましたが、Config.InsecureSkipVerify
が設定されていても、有効期限の確認は行われるようになりました。
セッションチケットの制御
アプリケーションはセッションチケットの内容を制御できるようになりました。
- 新しい
SessionState
型は再開可能なセッションを記述します。 SessionState.Bytes
メソッドおよびParseSessionState
関数は、SessionState
のシリアライズおよびデシリアライズを行います。Config.WrapSession
およびConfig.UnwrapSession
フックは、サーバー側でSessionState
をチケットに変換したり、チケットから戻したりします。Config.EncryptTicket
およびConfig.DecryptTicket
メソッドは、WrapSession
およびUnwrapSession
のデフォルト実装を提供します。ClientSessionState.ResumptionState
メソッドおよびNewResumptionState
関数は、クライアント側でセッションをキャッシュし再開するために使用されます。
セッションチケットのトラッキング防止
接続間でセッションチケットがトラッキングメカニズムとして使用される可能性を減らすため、サーバーは再開ごとに新しいチケットを発行します(サポートされており無効化されていない場合)。また、チケットには暗号化キーを識別するための識別子が含まれなくなりました。Conn.SetSessionTicketKeys
に多くのキーを渡す場合、この変更により性能コストが目立つ可能性があります。
Extended Master Secretのサポート
クライアントとサーバーの両方が、Extended Master Secret拡張(RFC 7627)を実装しました。これにより、ConnectionState.TLSUnique
の非推奨が撤回され、Extended Master Secretをサポートする再開接続で設定されるようになりました。
QUICのサポート
新しいQUICConn
型がQUIC実装(0-RTTサポートを含む)をサポートします。ただし、これはQUICの実装そのものではなく、TLSでは0-RTTはまだサポートされていません。
新しいVersionName関数
新しいVersionName
関数は、TLSバージョン番号に対応する名前を返します。
クライアント認証エラー時のTLSアラートコードの改善
サーバーから送信されるクライアント認証失敗時のTLSアラートコードが改善されました。以前は、これらの失敗は常に「bad certificate」アラートを返していましたが、以下のようにより適切なアラートコードが返されるようになりました(RFC 5246およびRFC 8446に準拠):
- TLS 1.3接続の場合、
RequireAnyClientCert
またはRequireAndVerifyClientCert
を使用してクライアント認証が必要とされ、クライアントが証明書を提供しない場合、「certificate required」アラートが返されます。 - クライアントが、サーバーで設定された信頼された証明書機関に署名されていない証明書を提供した場合、「unknown certificate authority」アラートが返されます。
- クライアントが期限切れまたはまだ有効でない証明書を提供した場合、「expired certificate」アラートが返されます。
- その他のクライアント認証エラーについては、引き続き「bad certificate」アラートが返されます。
crypto/x509
RevocationList.RevokedCertificates
は非推奨となり、新しいRevokedCertificateEntries
フィールドに置き換えられました。これはRevocationListEntry
のスライスで、pkix.RevokedCertificate
に含まれるすべてのフィールドと失効理由コードを含みます。- 名前制約(Name Constraints)は、非リーフ証明書に正しく適用されるようになり、制約が表現されている証明書には適用されなくなりました。
debug/elf
- 新しい
File.DynValue
メソッドが追加され、指定された動的タグにリストされている数値を取得できるようになりました。 DT_FLAGS_1
動的タグで許可される定数フラグは、型DynFlag1
として定義されました。これらのタグはDF_1
で始まる名前を持っています。- パッケージには新しい定数
COMPRESS_ZSTD
が定義されました。 - 新しい定数
R_PPC64_REL24_P9NOTOC
が定義されました。
debug/pe
Section.Data
やSection.Open
によって返されるリーダーを使用して、初期化されていないデータを含むセクションを読み取ろうとすると、エラーが返されるようになりました。
embed
FS.Open
によって返されるio/fs.File
は、新たにio.ReaderAt
を実装するReadAt
メソッドを持つようになりました。FS.Open.Stat
を呼び出すと、io/fs.FormatFileInfo
を呼び出すString
メソッドを実装した型を返すようになりました。
encoding/binary
- 新しい
NativeEndian
変数が追加され、現在のマシンのネイティブエンディアンを使用してバイトスライスと整数の間で変換を行えるようになりました。
errors
新しいErrUnsupported
エラーは、リクエストされた操作がサポートされていないため実行できないことを標準的に示す方法を提供します。たとえば、ハードリンクをサポートしていないファイルシステムでos.Link
を呼び出した場合に使用されます。
flag
- 新しい
BoolFunc
関数およびFlagSet.BoolFunc
メソッドは、引数を必要とせず、フラグが使用されたときに関数を呼び出すブールフラグを定義します。これは、Func
と似ていますが、ブール型のフラグ専用です。 - 同じ名前のフラグに対して
Set
がすでに呼び出されている場合に、Bool
、BoolVar
、Int
、IntVar
などでフラグを定義するとパニックが発生します。この変更は、初期化順序の変更がフラグ操作の順序を予期しない形で変更するケースを検出することを目的としています。この問題を修正するためには、多くの場合、明示的なパッケージ依存関係を導入して、定義がSet
操作の前に正しく行われるように順序付ける必要があります。
go/ast
- 新しい
IsGenerated
述語は、ファイルの構文ツリーに、ツールによって生成されたファイルであることを示す特別なコメントが含まれているかどうかを報告します。 - 新しい
File.GoVersion
フィールドは、//go:build
または// +build
ディレクティブによって必要とされる最低限のGoバージョンを記録します。
go/build
このパッケージは、ファイルヘッダー(パッケージ宣言の前)にあるビルドディレクティブ(//go:
で始まるコメント)を解析するようになりました。これらのディレクティブは、新しいPackage
フィールドDirectives
、TestDirectives
、XTestDirectives
で利用可能です。
go/build/constraint
新しいGoVersion
関数は、ビルド式によって暗示される最低限のGoバージョンを返します。
go/token
- 新しい
File.Lines
メソッドは、File.SetLines
で受け入れられる形式と同じ形式でファイルの行番号テーブルを返します。
go/types
- 新しい
Package.GoVersion
メソッドは、パッケージのチェックに使用されたGo言語のバージョンを返します。
hash/maphash
hash/maphash
パッケージに純粋なGo実装が追加され、purego
ビルドタグを使用して選択できるようになりました。
html/template
- JavaScriptテンプレートリテラル内にアクションが表示された場合、新しいエラー
ErrJSTemplate
が返されるようになりました。以前は非公開のエラーが返されていました。
io/fs
- 新しい
FormatFileInfo
関数は、FileInfo
のフォーマットされたバージョンを返します。 - 新しい
FormatDirEntry
関数は、DirEntry
のフォーマットされたバージョンを返します。 ReadDir
によって返されるDirEntry
の実装は、FormatDirEntry
を呼び出すString
メソッドを実装するようになりました。また、WalkDirFunc
に渡されるDirEntry
値についても同様です。
math/big
- 新しい
Int.Float64
メソッドは、多倍長整数に最も近い浮動小数点値を返し、発生した丸めの有無を示します。
net
- Linuxでは、カーネルが対応している場合に
net
パッケージでMultipath TCPを使用できるようになりました。デフォルトでは使用されません。- クライアントで利用可能な場合、
Dialer.Dial
またはDialer.DialContext
メソッドを呼び出す前にDialer.SetMultipathTCP
メソッドを呼び出します。 - サーバーで利用可能な場合、
ListenConfig.Listen
メソッドを呼び出す前にListenConfig.SetMultipathTCP
メソッドを呼び出します。 - ネットワークは通常どおり
"tcp"
、"tcp4"
、または"tcp6"
を指定します。
- クライアントで利用可能な場合、
- カーネルまたはリモートホストがMultipath TCPをサポートしていない場合、接続は静かにTCPにフォールバックします。
- 特定の接続がMultipath TCPを使用しているかどうかをテストするには、
TCPConn.MultipathTCP
メソッドを使用します。
将来のGoリリースでは、Multipath TCPがサポートされているシステムでデフォルトで有効になる可能性があります。
net/http
- 新しい
ResponseController.EnableFullDuplex
メソッドにより、サーバーハンドラがHTTP/1リクエストボディを読みながらレスポンスを書き込むことが可能になります。通常、HTTP/1サーバーは、レスポンスの書き込みを開始する前に残りのリクエストボディを自動的に消費しますが、このメソッドはその動作を無効にします。これにより、リクエスト全体を書き込んでからレスポンスを読むクライアントがデッドロックするのを防ぎます。 - 新しい
ErrSchemeMismatch
エラーは、サーバーがHTTPSリクエストに対してHTTPレスポンスを返した場合に、Client
およびTransport
から返されます。 net/http
パッケージはerrors.ErrUnsupported
をサポートするようになりました。そのため、errors.Is(http.ErrNotSupported, errors.ErrUnsupported)
という式はtrue
を返します。
os
- プログラムは、
Chtimes
関数に空のtime.Time
値を渡すことで、アクセス時刻または更新時刻を変更せずに保持できるようになりました。 - Windows:
File.Chdir
メソッドは、これまで常にエラーを返していましたが、現在はカレントディレクトリをファイルに変更するようになりました。 - Unixシステム: 非ブロッキングのファイルディスクリプタが
NewFile
に渡された場合、File.Fd
メソッドを呼び出しても非ブロッキングディスクリプタが返されます。以前は、ブロッキングモードに変換されていました。 - Windows: 存在しないファイルに対して
Truncate
を呼び出すと、空のファイルを作成していましたが、現在はファイルが存在しないことを示すエラーを返すようになりました。 - Windows:
TempDir
呼び出し時に、GetTempPathW
ではなく、利用可能であればGetTempPath2W
を使用するようになりました。この新しい動作はセキュリティを強化するもので、SYSTEM権限で実行されているプロセスによって作成された一時ファイルに、非SYSTEMプロセスがアクセスできないようにします。 - Windows: UTF-16で保存されており、有効なUTF-8として表現できない名前のファイルを操作できるようになりました。
- Windows:
Lstat
は、パスセパレータで終わるパスに対してシンボリックリンクを解決するようになり、POSIXプラットフォームでの動作と一致するようになりました。 ReadDir
関数やFile.ReadDir
メソッドによって返されるio/fs.DirEntry
インターフェースの実装が、io/fs.FormatDirEntry
を呼び出すString
メソッドを実装するようになりました。DirFS
関数によって返されるio/fs.FS
インターフェースの実装が、io/fs.ReadFileFS
およびio/fs.ReadDirFS
インターフェースを実装するようになりました。
path/filepath
WalkDir
の関数引数に渡されるio/fs.DirEntry
インターフェースの実装が、io/fs.FormatDirEntry
を呼び出すString
メソッドを実装するようになりました。
reflect
- Go 1.21では、
ValueOf
が引数をヒープに割り当てる必要がなくなり、Value
の内容がスタックに割り当てられることを可能にしました。ほとんどのValue
操作も、基になる値をスタックに割り当てることができます。 - 新しい
Value
メソッドValue.Clear
が、マップの内容をクリアするか、スライスの内容をゼロにする機能を提供します。これは、言語に追加された新しいビルトイン関数clear
に対応しています。 SliceHeader
およびStringHeader
型は非推奨となりました。新しいコードでは、unsafe.Slice
、unsafe.SliceData
、unsafe.String
、またはunsafe.StringData
を使用することを推奨します。
regexp
Regexp
型に新しいMarshalText
およびUnmarshalText
メソッドが追加されました。これらはencoding.TextMarshaler
およびencoding.TextUnmarshaler
を実装しており、encoding/json
などのパッケージで使用されます。
runtime
- Goプログラムによって生成されるスタックトレース(クラッシュ時や
runtime.Stack
の呼び出し、debug=2
でのゴルーチンプロファイル収集時など)は、各ゴルーチンを作成したゴルーチンのIDを含むようになりました。 - Goアプリケーションがクラッシュする際、環境変数
GOTRACEBACK=wer
を設定するか、クラッシュ前にdebug.SetTraceback("wer")
を呼び出すことで、Windowsエラーレポート(WER)を有効化できるようになりました。WERを有効化する以外は、ランタイムはGOTRACEBACK=crash
と同様に動作します。Windows以外のシステムでは、GOTRACEBACK=wer
は無視されます。 GODEBUG=cgocheck=2
(cgoポインタ渡しルールの厳密な検査)はデバッグオプションとして利用できなくなりました。その代わり、GOEXPERIMENT=cgocheck2
を使用して実験的に利用可能です。このモードは、起動時ではなくビルド時に選択する必要があります。GODEBUG=cgocheck=1
は引き続き利用可能であり、デフォルト値のままです。- ランタイムパッケージに新しい型
Pinner
が追加されました。Pinner
は、Goのメモリを「ピン留め」するために使用でき、非Goコードでより自由に使用できるようにします。たとえば、ピン留めされたGoメモリを参照するGo値をCコードに渡すことが可能になりました。以前は、cgoのポインタ渡しルールにより、このようなネストされた参照を渡すことは禁止されていました。詳細についてはドキュメント を参照してください。
runtime/metrics
- 内部で使用されていたいくつかのGCメトリクス(たとえば、ライブヒープサイズ)が利用可能になりました。
GOGC
やGOMEMLIMIT
もメトリクスとして利用可能です。
runtime/trace
- amd64およびarm64でトレースを収集する際のCPUコストが大幅に削減されました。前リリースと比較して最大10倍の改善が見られます。
- トレースには、Goランタイムが「ストップ・ザ・ワールド」を行うすべての理由(ガベージコレクションだけではなく)に関する明示的なイベントが含まれるようになりました。
sync
- 新しい
OnceFunc
、OnceValue
、OnceValues
関数は、初回使用時に値を遅延初期化するためのOnce
の一般的な使用法を簡略化するために追加されました。
syscall
- Windows:
Fchdir
関数は、以前は常にエラーを返していましたが、現在は引数をカレントディレクトリに変更するようになりました。 - FreeBSD:
SysProcAttr
に新しいフィールドJail
が追加され、作成されるプロセスをジャイル環境に配置できるようになりました。 - Windows:
syscall
パッケージは、UTF-16で保存されており有効なUTF-8として表現できない名前のファイルの操作をサポートするようになりました。UTF16ToString
およびUTF16FromString
関数は、UTF-16データとWTF-8文字列の間で変換を行います。これは後方互換性を備えており、WTF-8は以前のリリースで使用されていたUTF-8形式のスーパーセットです。 - 新しいエラー
errors.ErrUnsupported
と一致するいくつかのエラー値が追加されました。以下のエラーについて、errors.Is(err, errors.ErrUnsupported)
はtrue
を返します:ENOSYS
ENOTSUP
EOPNOTSUPP
EPLAN9
(Plan 9のみ)ERROR_CALL_NOT_IMPLEMENTED
(Windowsのみ)ERROR_NOT_SUPPORTED
(Windowsのみ)EWINDOWS
(Windowsのみ)
testing
- 新しい
-test.fullpath
オプションは、テストログメッセージにベース名ではなくフルパス名を出力するようになりました。 - 新しい
Testing
関数は、プログラムがgo test
によって作成されたテストであるかどうかを報告します。
testing/fstest
Open.Stat
を呼び出すと、io/fs.FormatFileInfo
を呼び出すString
メソッドを実装した型を返すようになりました。
unicode
unicode
パッケージとそれに関連するシステム全体のサポートが、Unicode 15.0.0にアップグレードされました。
サポート環境
Darwin
Go 1.20のリリースノートで発表されたように、Go 1.21ではmacOS 10.15 Catalina以降が必要となり、以前のバージョンのサポートは終了しました。
Windows
Go 1.20のリリースノートで発表されたように、Go 1.21ではWindows 10またはWindows Server 2016以降が必要となり、以前のバージョンのサポートは終了しました。
WebAssembly
- 新しい
go:wasmimport
ディレクティブを使用して、Goプログラム内でWebAssemblyホストから関数をインポートできるようになりました。 - Goスケジューラーは、特に非同期イベントで頻繁にブロックするアプリケーションにおいて、JavaScriptイベントループとより効率的に連携するようになりました。
WebAssembly System Interface
- Go 1.21では、WebAssembly System Interface(WASI)のプレビュー1(
GOOS=wasip1
、GOARCH=wasm
)への実験的なポートが追加されました。 - 新しい
GOOS
値「wasip1」の追加により、Goツールは*_wasip1.go
という名前のGoファイルを、そのGOOS
値が使用されている場合を除いて無視するようになりました。このパターンに一致する既存のファイル名がある場合は、それらをリネームする必要があります。
ppc64/ppc64le
- Linux:
GOPPC64=power10
がPC相対命令、プレフィックス命令、および他の新しいPower10命令を生成するようになりました。 - AIX:
GOPPC64=power10
がPower10命令を生成しますが、PC相対命令は生成しません。 - Linux ppc64le:
GOPPC64=power10
、GOOS=linux
、GOARCH=ppc64le
でポジション独立バイナリをビルドする場合、多くのケースでバイナリサイズが削減されます(一部のケースでは最大3.5%)。ポジション独立バイナリは以下の-buildmode
値でビルドされます:c-archive
c-shared
shared
pie
plugin
loong64
linux/loong64
ポートは、以下の-buildmode
オプションをサポートするようになりました:c-archive
c-shared
pie