まえがき
Go 1.21 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.21 Release Notes
次のバージョン:Go1.22のリリースノート(日本語訳)
前のバージョン:Go1.20のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
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を返します:ENOSYSENOTSUPEOPNOTSUPPEPLAN9(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-archivec-sharedsharedpieplugin
loong64
linux/loong64ポートは、以下の-buildmodeオプションをサポートするようになりました:c-archivec-sharedpie