まえがき
Go 1.22 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.22 Release Notes
次のバージョン:Go1.23のリリースノート(日本語訳)
前のバージョン:Go1.21のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.22の紹介
最新のGoリリースであるバージョン1.22が、Go 1.21から6ヶ月後に登場しました。このリリースの主な変更点は、ツールチェイン、ランタイム、ライブラリの実装にあります。従来通り、リリースではGo 1の互換性の約束が維持されています。ほとんどのGoプログラムがこれまで通りコンパイルおよび実行できることを期待しています。
言語の変更
Go 1.22では、forループに関して2つの変更が行われました。
ループ変数のスコープの変更
これまで、forループによって宣言された変数は1回作成され、各反復で更新されていました。Go 1.22では、ループの各反復ごとに新しい変数が作成されるようになり、偶発的な共有バグを回避します。この変更に関する提案で説明されている移行サポートツールは、Go 1.21と同様に動作します。
整数の範囲指定をサポート
forループが整数を範囲として使用できるようになりました。以下はその例です:
| |
詳細は仕様 を参照してください。
range-over-function iteratorsのプレビュー
Go 1.22には、将来のGoバージョンで検討されている言語変更「関数イテレータの範囲指定」のプレビューが含まれています。この機能を有効にするには、GOEXPERIMENT=rangefuncを指定してビルドしてください。
Tools
Go command
ワークスペース内のコマンドは、ワークスペースの依存関係を含むvendorディレクトリを使用できるようになりました。このディレクトリは、go work vendorコマンドで作成され、-modフラグがvendorに設定されているときにビルドコマンドで使用されます。vendorディレクトリが存在する場合、この設定がデフォルトになります。
ワークスペースのvendorディレクトリの内容は、単一のモジュールのvendorディレクトリの内容とは異なることに注意してください。もしワークスペースのルートディレクトリにモジュールのディレクトリも含まれている場合、そのvendorディレクトリにはワークスペースまたはモジュールのいずれかの依存関係が含まれますが、両方は含まれません。
go getは、レガシーGOPATHモード(GO111MODULE=off)でモジュール外で使用することはできなくなりました。他のビルドコマンド(go buildやgo testなど)は、レガシーGOPATHプログラムに対して無期限に動作し続けます。
go mod initは、他のベンダリングツール(例えば、Gopkg.lock)の設定ファイルからモジュール要件をインポートしなくなりました。
go test -coverは、テストファイルを持たないカバレッジ対象のパッケージに対してもカバレッジの概要を表示するようになりました。Go 1.22以前では、次のように報告されていました:
? mymod/mypack [no test files]
Go 1.22では、パッケージ内の関数はカバレッジ未測定として扱われます:
mymod/mypack coverage: 0.0% of statements
パッケージに実行可能なコードが全くない場合、意味のあるカバレッジパーセンテージを報告できません。そのようなパッケージについては、goツールは引き続き「テストファイルがない」と報告します。
リンクを呼び出すgo buildコマンドは、外部(C)リンカが使用される場合にcgoが有効でないとエラーを発生させます。(Goランタイムは、Cリンカによって追加されたライブラリと互換性があることを確認するために、cgoサポートを必要とします。)
Trace
トレースツールのウェブUIは、新しいトレーサーをサポートするための作業の一環として、いくつかの問題を解決し、さまざまなサブページの可読性が向上する形で刷新されました。ウェブUIでは、スレッド指向のビューでトレースを探索することができるようになりました。また、トレースビューアは、すべてのシステムコールの完全な所要時間を表示するようになりました。
これらの改善は、Go 1.22以降でビルドされたプログラムによって生成されたトレースの表示にのみ適用されます。将来のリリースで、これらの改善が古いバージョンのGoで生成されたトレースにも適用される予定です。
Vet
ループ変数への参照
vetツールの挙動は、Go 1.22でのループ変数の新しい意味に合わせて変更されました。Go 1.22以降のファイルを分析する際、vetは関数リテラル内でループの反復を超えて生存する可能性のあるループ変数への参照を報告しなくなります。Go 1.22では、ループ変数は各反復ごとに新しく作成されるため、そのような参照がループによって更新された後で変数を使用するリスクはなくなりました。
append後の欠落値に関する新しい警告
vetツールは、スライスに追加する値がないappend呼び出し(例:slice = append(slice))に対して警告を表示するようになりました。このような文は効果がなく、実務経験から、ほぼ常に間違いであることが示されています。
time.Sinceの遅延呼び出しに関する新しい警告
vetツールは、defer文内でのtime.Since(t)の非遅延呼び出しを報告するようになりました。これは、defer文が呼ばれる前にtime.Now().Sub(t)を呼び出すことと同じです。ほとんどのケースでは、正しいコードではtime.Since呼び出しを遅延させる必要があります。例えば:
| |
log/slog呼び出しにおけるキーと値の不一致に関する新しい警告
vetツールは、キーと値のペアを交互に受け入れる構造化ログパッケージlog/slogの関数やメソッドへの呼び出しで無効な引数がある場合に警告を表示するようになりました。キー位置に文字列でもslog.Attrでもない引数がある場合や、最終的なキーが値を欠いている場合に報告されます。
ランタイム
ランタイムは、型ベースのガーベジコレクションメタデータを各ヒープオブジェクトに近づけることで、GoプログラムのCPUパフォーマンス(レイテンシまたはスループット)を1~3%向上させます。この変更は、冗長なメタデータを重複排除することにより、ほとんどのGoプログラムのメモリオーバーヘッドを約1%削減します。いくつかのプログラムでは、この変更がメモリアロケータのサイズクラスの境界を調整するため、改善が小さく見えるかもしれません。そのため、いくつかのオブジェクトは、サイズクラスを上に移動する可能性があります。
この変更の結果として、以前は16バイト(またはそれ以上)の境界に常に整列されていたオブジェクトのアドレスが、8バイトの境界にのみ整列されるようになります。メモリアドレスが8バイト以上に整列されることを要求するアセンブリ命令を使用し、以前のアライメント動作に依存しているプログラムは動作しなくなる可能性がありますが、そのようなプログラムはまれであると予想されています。これらのプログラムは、GOEXPERIMENT=noallocheadersを使って古いメタデータレイアウトに戻し、以前のアライメント動作を復元できますが、パッケージ所有者は、アセンブリコードを更新してアライメントの仮定を避けるべきです。このワークアラウンドは将来のリリースで削除される予定です。
Windows/amd64ポートでは、-buildmode=c-archiveまたは-buildmode=c-sharedでビルドされたGoライブラリをリンクまたはロードするプログラムが、Goランタイムによって処理されない例外をキャッチするために、SetUnhandledExceptionFilter Win32関数を使用できるようになりました。この機能は、すでにwindows/386ポートではサポートされていました。
コンパイラ
プロファイル駆動型最適化(PGO)ビルドは、以前よりも多くのコールのデバーチャライズを実行できるようになりました。代表的なGoプログラムのほとんどで、PGOを有効にすることで実行時に2〜14%の改善が見られます。
コンパイラは、デバーチャライズとインライン化を交互に実行するようになり、インターフェイスメソッドの呼び出しがより良く最適化されるようになりました。
Go 1.22には、コンパイラのインライン化フェーズの強化された実装のプレビューも含まれており、重要な呼び出しサイト(例えばループ内)ではインライン化を促進し、重要でない呼び出しサイト(例えばpanicパス)ではインライン化を抑制するためのヒューリスティクスを使用しています。GOEXPERIMENT=newinlinerで新しい呼び出しサイトヒューリスティクスを有効にできます。詳細については、issue #61502 を参照し、フィードバックを提供してください。
リンカ
リンカの-sおよび-wフラグは、すべてのプラットフォームでより一貫性を持つようになりました。-wフラグはDWARFデバッグ情報の生成を抑制します。-sフラグはシンボルテーブルの生成を抑制します。-sフラグは-wフラグも含意するため、-w=0で-negateできます。つまり、-s -w=0はDWARFデバッグ情報の生成は行うが、シンボルテーブルは生成しないバイナリを生成します。
ELFプラットフォームでは、-Bリンカーフラグが特別な形式をサポートするようになりました。-B gobuildidを指定すると、リンカはGoビルドIDから派生したGNUビルドID(ELF NT_GNU_BUILD_IDノート)を生成します。
Windowsでは、-linkmode=internalでビルドする際に、リンカがCオブジェクトファイルからSEH情報を保持し、.pdataおよび.xdataセクションを最終バイナリにコピーするようになりました。これにより、WinDbgなどのネイティブツールを使用したバイナリのデバッグやプロファイリングが容易になります。これまでは、C関数のSEH例外ハンドラが尊重されていなかったため、この変更によりプログラムの挙動が異なる可能性があります。-linkmode=externalには影響はなく、外部リンカはすでにSEH情報を保持しています。
Bootstrap
Go 1.20のリリースノート で述べたように、Go 1.22ではブートストラップのためにGo 1.20の最終ポイントリリース以降が必要です。Go 1.24では、Go 1.22の最終ポイントリリース以降がブートストラップに必要になると予想されています。
標準ライブラリ
新しい math/rand/v2 パッケージ
Go 1.22 には、標準ライブラリ初の「v2」パッケージである math/rand/v2 が追加されました。math/rand との違いはissue #61716
に詳細が記載されています。主な変更点は次の通りです:
math/randで非推奨となったReadメソッドは、math/rand/v2には引き継がれていません(math/randでは引き続き利用可能です)。Readメソッドのほとんどの呼び出しは、crypto/randのReadを代わりに使用するべきです。それ以外の場合、Uint64メソッドを使用してカスタムのReadを構築できます。- トップレベルの関数でアクセスされるグローバルジェネレーターは無条件にランダムにシードされます。API は結果の固定されたシーケンスを保証しないため、スレッドごとのランダムジェネレーターの状態の最適化が可能になりました。
Sourceインターフェースには、単一のUint64メソッドがあり、Source64インターフェースは存在しません。- 多くのメソッドが、
math/randでは出力ストリームを変更するために採用できなかった高速なアルゴリズムを使用しています。 math/randのトップレベル関数およびメソッドであるIntn,Int31,Int31n,Int63,Int64nは、math/rand/v2ではより慣用的にスペルが変更され、IntN,Int32,Int32N,Int64,Int64Nとなっています。新たに、Uint32,Uint32N,Uint64,Uint64N,UintNというトップレベル関数およびメソッドも追加されました。- 新しい汎用関数
Nは、Int64NやUint64Nのようなものですが、任意の整数型で動作します。例えば、0から5分までのランダムな期間を取得するにはrand.N(5 * time.Minute)と記述します。 math/randのSourceで提供されていた Mitchell & Reeds の LFSR ジェネレーターは、よりモダンな疑似ランダムジェネレーターである ChaCha8 と PCG に置き換えられました。ChaCha8 は、PCG に似た効率で暗号学的に強いランダム数生成器です。ChaCha8 はmath/rand/v2のトップレベル関数で使用されているアルゴリズムです。Go 1.22 以降、math/randのトップレベル関数(明示的にシードされていない場合)と Go ランタイムもランダムネスのために ChaCha8 を使用します。- 今後のリリース(おそらく Go 1.23)で API 移行ツールを提供する予定です。
新しい go/version パッケージ
新しい go/version パッケージは、Goのバージョン文字列の検証と比較のための関数を実装しています。
強化されたルーティングパターン
標準ライブラリのHTTPルーティングは、より表現力豊かになりました。net/http.ServeMux で使用されるパターンが強化され、メソッドやワイルドカードを受け入れるようになりました。
- メソッドを指定したハンドラの登録(例: “POST /items/create”)は、そのメソッドのリクエストだけをハンドラにルーティングします。メソッドを指定したパターンは、メソッドなしのパターンより優先されます。特別なケースとして、“GET” を使って登録されたハンドラは “HEAD” にも登録されます。
- パターンにおけるワイルドカード(例:
/items/{id})は、URLパスのセグメントにマッチします。実際のセグメント値は、Request.PathValueメソッドを使ってアクセスできます。...で終わるワイルドカード(例:/files/{path...})は、パターンの末尾に現れ、残りのすべてのセグメントにマッチします。 - パターンが「/」で終わる場合、常にそのプレフィックスを持つすべてのパスにマッチします。正確にそのパターンを一致させるには、末尾に
{$}を付けます(例:/exact/match/{$})。 - もし2つのパターンがリクエストにマッチする場合、より具体的なパターンが優先されます。どちらも具体的でない場合、パターンは競合します。このルールは元々の優先順位ルールを一般化し、パターンが登録される順序は重要でないという特性を維持します。
この変更により、いくつかの後方互換性が破れました。例えば、「{」および「}」を含むパターンの動作が変更されましたが、エスケープされたパスの扱いも改善されています。この変更は、GODEBUG フィールド httpmuxgo121 によって制御されており、httpmuxgo121=1 を設定することで旧動作に戻すことができます。
ライブラリの細かい変更
いつも通り、Go 1の互換性を考慮して、ライブラリにいくつかのマイナーな変更と更新が行われました。また、ここでは列挙されていないいくつかのパフォーマンス改善も行われています。
archive/tar
新しいメソッド Writer.AddFS は、fs.FS からすべてのファイルをアーカイブに追加します。
archive/zip
新しいメソッド Writer.AddFS は、fs.FS からすべてのファイルをアーカイブに追加します。
bufio
SplitFunc が ErrFinalToken を nil トークンと共に返すと、Scanner は即座に停止するようになりました。以前は、最終的な空のトークンが報告されてから停止していましたが、通常これは望ましくありませんでした。最終的な空のトークンを報告したい呼び出し元は、nil の代わりに []byte{} を返すことができます。
cmp
新しい関数 Or は、ゼロ値でない最初の値を返します。
crypto/tls
ConnectionState.ExportKeyingMaterialは、TLS 1.3 が使用されているか、サーバーとクライアントの両方がextended_master_secret拡張をサポートしている場合にのみエラーを返すようになりました。crypto/tlsは Go 1.20 からこの拡張をサポートしています。この動作は、tlsunsafeekm=1のGODEBUG設定で無効にできます。crypto/tlsサーバーが提供する最小バージョンは、デフォルトで TLS 1.2 になりました(config.MinimumVersionで指定しない限り)。これは、crypto/tlsクライアントの挙動に一致します。この変更は、tls10server=1のGODEBUG設定で元に戻すことができます。デフォルトでは、ECDHE をサポートしない暗号スイートは、TLS 1.3 より前のハンドシェイク時にクライアントまたはサーバーのいずれからも提供されなくなりました。この変更は、
tlsrsakex=1のGODEBUG設定で元に戻すことができます。
crypto/x509
新しいメソッド
CertPool.AddCertWithConstraintは、ルート証明書にカスタム制約を追加し、チェーン構築時に適用できます。Android では、ルート証明書が
/data/misc/keychain/certs-addedと/system/etc/security/cacertsの両方から読み込まれるようになりました。新しい型
OIDは、31ビットより大きい個々のコンポーネントを持つ ASN.1 オブジェクト識別子(OID)をサポートします。Certificate構造体に新しく追加されたPoliciesフィールドは、解析時に埋め込まれます。asn1.ObjectIdentifierでは表現できない OID はPoliciesに表示され、古いPolicyIdentifiersフィールドには表示されません。CreateCertificateを呼び出す際には、Policiesフィールドは無視され、ポリシーはPolicyIdentifiersフィールドから取得されます。x509usepolicies=1のGODEBUG設定を使用すると、これが反転し、Policiesフィールドから証明書ポリシーをポピュレートし、PolicyIdentifiersフィールドは無視されます。Go 1.23 では、x509usepoliciesのデフォルト値を変更し、Policiesをデフォルトのフィールドとしてマシュアル化する予定です。
database/sql
新しい Null[T] 型は、任意のカラム型に対して nullable カラムをスキャンする方法を提供します。
debug/elf
R_MIPS_PC32定数が MIPS64 システム用に定義されました。追加の
R_LARCH_*定数が LoongArch システム用に定義されました。
encoding
encoding/base32,encoding/base64,encoding/hexパッケージの各Encoding型に新しくAppendEncodeとAppendDecodeメソッドが追加され、バイトスライスのエンコードとデコードが簡素化され、バイトスライスのバッファ管理が行われます。base32.Encoding.WithPaddingとbase64.Encoding.WithPaddingメソッドは、パディング引数がNoPadding以外の負の値である場合、パニックを起こすようになりました。
encoding/json
- Marshaling およびエンコーディング機能は、
\bおよび\f文字をそれぞれ\u0008と\u000cではなく、\bと\fとしてエスケープするようになりました。
go/ast
以下の構文識別子解決に関連する宣言は廃止されました:
Ident.Obj,Object,Scope,File.Scope,File.Unresolved,Importer,Package,NewPackage。一般に、型情報なしでは識別子を正確に解決することはできません。例えば、T{K: ""}の識別子Kは、Tがマップ型の場合はローカル変数名である可能性があり、Tが構造体型の場合はフィールド名である可能性があります。新しいプログラムでは識別子の解決にはgo/typesパッケージを使用することが推奨されます。詳細は Object , Info.Uses , Info.Defs を参照してください。新しい
ast.Unparen関数は、式から囲まれた括弧を取り除きます。
go/types
新しい
Alias型は型エイリアスを表します。以前は型エイリアスは明示的に表現されていなかったため、型エイリアスへの参照はエイリアスされた型をそのまま表記するのと同等であり、エイリアスの名前は失われていました。新しい表現方法では中間的なAliasを保持します。これにより、型エイリアスの名前を報告する改善されたエラーレポートが可能になり、型エイリアスを含む循環型宣言の処理が改善されます。将来的なリリースでは、Alias型は型パラメータ情報も持つ予定です。新しい関数UnaliasはAlias型(または他の型)の実際の型を返します。Alias型は既存の型スイッチに影響を与える可能性があるため、この機能はGODEBUGフィールドgotypesaliasで制御されます。gotypesalias=0の場合、従来通り動作し、Alias型は作成されません。gotypesalias=1の場合、Alias型が作成され、クライアントはそれを期待する必要があります。デフォルトはgotypesalias=0であり、将来的にはgotypesalias=1に変更される予定です。go/typesを使用するクライアントは、早期にgotypesalias=1に対応するようにコードを調整することを推奨します。Info構造体は、ファイルごとの Go バージョン情報を提供するFileVersionsマップを公開するようになりました。新しいヘルパーメソッド
PkgNameOfは、指定されたインポート宣言に対してローカルパッケージ名を返します。SizesForの実装は、コンパイラの引数が “gc” の場合にコンパイラと同じ型サイズを計算するように調整されました。型チェックで使用されるデフォルトのSizes実装は、types.SizesFor("gc", "amd64")です。関数本体を表す字句環境ブロック(
Scope)の開始位置(Pos)が変更されました。以前は関数本体の開き中括弧から始まっていましたが、現在は関数のfuncトークンから始まります。
html/template
- JavaScript のテンプレートリテラル内に Go テンプレートアクションを含めることができるようになり、そのようなテンプレートを解析するときに
ErrJSTemplateを返さなくなりました。同様に、GODEBUG 設定jstmpllitinterpも効果がなくなりました。
io
- 新しい
SectionReader.Outerメソッドは、NewSectionReaderに渡されたReaderAt、オフセット、サイズを返します。
log/slog
- 新しい
SetLogLoggerLevel関数は、slog と log パッケージ間のブリッジに対するログレベルを制御します。これにより、slog のトップレベルのロギング関数の呼び出しの最小レベルを設定し、slog を通じて呼び出されるlog.Loggerのレベルも設定されます。
math/big
- 新しい
Rat.FloatPrecメソッドは、有理数を浮動小数点数として正確に表現するために必要な小数点以下の桁数を計算し、正確な十進表現が可能かどうかも確認します。
net
io.CopyがTCPConnからUnixConnにコピーする際、可能であれば Linux のsplice(2)システムコールを使用するようになり、TCPConn.WriteToメソッドを新たに使用します。-tags=netgoでビルドするとき、Go の DNS リゾルバは、DNS クエリを行う前に、Windows のホストファイル(%SystemRoot%\System32\drivers\etc\hosts)で一致する名前を検索するようになりました。
net/http
新しい関数
ServeFileFS、FileServerFS、およびNewFileTransportFSは、fs.FSを操作する、既存のServeFile、FileServer、NewFileTransportのバージョンです。HTTP サーバーとクライアントは、無効な空の
Content-Lengthヘッダーを含むリクエストとレスポンスを拒否するようになりました。以前の動作は、GODEBUG フィールドhttplaxcontentlength=1を設定することで復元できます。新しいメソッド
Request.PathValueはリクエストからパスのワイルドカード値を返し、新しいメソッドRequest.SetPathValueはリクエストにパスワイルドカード値を設定します。
net/http/cgi
- CGI プロセスを実行する際、
PATH_INFO変数は常に空文字列か、/文字で始まる値に設定されるようになりました(RFC 3875 に準拠)。以前は、Handler.Rootとリクエスト URL の組み合わせによってこの要件を違反することがありました。
net/netip
- 新しい
AddrPort.Compareメソッドは、2 つのAddrPortを比較します。
os
Windows では、
Stat関数がシステム内の別の名前付きエンティティにリンクするすべての再解析ポイントを追跡するようになりました。以前は、IO_REPARSE_TAG_SYMLINKとIO_REPARSE_TAG_MOUNT_POINTの再解析ポイントのみを追跡していました。Windows では、
OpenFileにO_SYNCを渡すと、書き込み操作が直接ディスクに書き込まれるようになり、Unix プラットフォームでのO_SYNCと同等になります。Windows では、
ReadDir、File.ReadDir、File.Readdir、およびFile.Readdirnames関数がディレクトリエントリをバッチで読み込むようになり、システムコールの数が削減され、最大 30% のパフォーマンス向上が見込まれます。io.CopyがFileからnet.UnixConnにコピーする際、可能であれば Linux のsendfile(2)システムコールを使用するようになり、新しいメソッドFile.WriteToを使用します。
os/exec
Windows では、
LookPathが%PATH%内の空のエントリを無視するようになり、実行可能ファイルの拡張子が見つからない場合はErrNotFoundを返すようになりました(以前はErrNotExistを返していました)。Windows では、
CommandおよびCmd.Startは、実行可能ファイルへのパスがすでに絶対パスであり、実行可能ファイルの拡張子がある場合、LookPathを呼び出さなくなりました。さらに、Cmd.Startは解決された拡張子をPathフィールドに書き戻さなくなったため、StringメソッドとStartメソッドを同時に呼び出すことが安全になりました。
reflect
Value.IsZeroメソッドは、浮動小数点数または複素数の負のゼロに対してもtrueを返し、_(空のフィールド)を持つ構造体値に対してもそのフィールドが非ゼロ値であればtrueを返すようになりました。この変更により、IsZeroは==演算子を使ったゼロとの比較と一致するようになります。PtrTo関数は廃止され、代わりにPointerToが推奨されます。新しい関数
TypeForは、型引数Tを表すTypeを返します。以前は、型のreflect.Typeを取得するにはreflect.TypeOf((*T)(nil)).Elem()を使用していましたが、これをreflect.TypeFor[T]()と書けるようになりました。
runtime/metrics
新しいヒストグラムメトリック
/sched/pauses/stopping/gc:seconds、/sched/pauses/stopping/other:seconds、/sched/pauses/total/gc:seconds、/sched/pauses/total/other:secondsは、ストップ・ザ・ワールド・ポーズに関する詳細な情報を提供します。stoppingメトリックは、ワールドを停止する決定からすべての goroutine が停止するまでの時間を報告します。totalメトリックは、ワールドを停止する決定からそれが再開するまでの時間を報告します。/gc/pauses:secondsメトリックは非推奨となり、/sched/pauses/total/gc:secondsメトリックと同じ意味になります。/sync/mutex/wait/total:secondsは、sync.Mutexとsync.RWMutexに加えて、ランタイム内部ロックに対する競合も含むようになりました。
runtime/pprof
ミューテックスのプロファイルは、ミューテックスにブロックされている goroutine の数によって競合をスケールします。これにより、ミューテックスが Go プログラムのボトルネックである程度をより正確に表現できるようになりました。例えば、100 の goroutine がミューテックスで 10 ミリ秒間ブロックされている場合、ミューテックスプロファイルは 10 ミリ秒の遅延ではなく、1 秒の遅延を記録します。
ミューテックスプロファイルは、
sync.Mutexとsync.RWMutexに加えて、ランタイム内部ロックに対する競合も含むようになりました。ランタイム内部ロックの競合は常にruntime._LostContendedRuntimeLockとして報告されます。将来のリリースでは、これらのケースに対する完全なスタックトレースが追加される予定です。Darwin プラットフォームでの CPU プロファイルは、プロセスのメモリマップを含むようになり、
pprofツールでの逆アセンブル表示が可能になります。
runtime/trace
実行トレーサーが完全にオーバーホールされ、いくつかの長年の問題が解決され、新しいユースケースへの道が開かれました。
実行トレーサーは、ほとんどのプラットフォーム(Windows を除く)でオペレーティングシステムのクロックを使用するようになり、低レベルコンポーネントが生成するトレースと相関させることが可能になりました。これにより、プラットフォームのクロックの信頼性に依存せず、正しいトレースを生成できます。
実行トレーサーは、定期的にオン・ザ・フライでパーティション分けされるようになり、これによりストリームとして処理することが可能になりました。
実行トレーサーには、すべてのシステムコールの完全な期間が含まれています。
実行トレーサーには、goroutine が実行されたオペレーティングシステムスレッドに関する情報も含まれるようになりました。
実行トレーサーの開始および停止の遅延影響が劇的に削減されました。
実行トレーサーは、ガーベジコレクションのマークフェーズ中に開始または終了することができるようになりました。
Go 開発者がこれらの改善を活用できるように、実験的なトレース読み取りパッケージが
golang.org/x/exp/traceにて提供されています。このパッケージは、Go 1.22 でビルドされたプログラムによって生成されたトレースでのみ動作することに注意してください。パッケージを試して、対応する提案の問題にフィードバックを提供してください。新しい実行トレーサー実装に問題が発生した場合、
GOEXPERIMENT=noexectracer2を使用して古い実装に戻すことができます。ただし、このオプションは将来的なリリースで削除される予定です。
slices
新しい関数
Concatは、複数のスライスを連結します。スライスのサイズを縮小する関数(
Delete、DeleteFunc、Compact、CompactFunc、Replace)は、現在、新しい長さと古い長さの間の要素をゼロにします。Insertは、引数iが範囲外である場合、常にパニックを引き起こします。以前は、挿入すべき要素がなかった場合に限り、パニックを引き起こしませんでした。
syscall
syscallパッケージは、Go 1.4 以降凍結され、Go 1.11 で非推奨としてマークされていました。このため、パッケージの使用に関して多くのエディタが警告を出していました。しかし、非推奨ではない機能もsyscallパッケージを必要としています(例えば、os/exec.Cmd.SysProcAttrフィールド)。そのため、syscallパッケージは再び非推奨としてマークされなくなりました。ただし、新しい機能は凍結されたままであり、新しいコードでは可能な限りgolang.org/x/sys/unixやgolang.org/x/sys/windowsを使用することが推奨されています。Linux では、新しい
SysProcAttr.PidFDフィールドにより、StartProcessやos/execを使用して子プロセスを起動する際に PID FD を取得できるようになりました。Windows では、
OpenにO_SYNCを渡すと、書き込み操作が直接ディスクに行われるようになります。これは Unix プラットフォームでのO_SYNCと同様の動作です。
testing/slogtest
- 新しい
Run関数は、サブテストを使用してテストケースを実行し、より細かな制御を提供します。
サポート環境
Darwin
macOS の 64-bit x86 アーキテクチャ(
darwin/amd64ポート)では、Go ツールチェーンがデフォルトで位置独立型実行ファイル(PIE)を生成するようになりました。非PIE バイナリを生成するには、-buildmode=exeビルドフラグを指定します。64-bit ARM ベースの macOS(darwin/arm64ポート)では、Go ツールチェーンがすでにデフォルトで PIE を生成します。Go 1.22 は macOS 10.15 Catalina で動作する最後のリリースであり、Go 1.23 では macOS 11 Big Sur 以降が必要です。
Arm
GOARM環境変数を使用して、ソフトウェアまたはハードウェア浮動小数点を選択できるようになりました。以前はGOARMの有効な値は 5, 6, または 7 でしたが、これらの値にオプションで,softfloatまたは,hardfloatを付け加えることで浮動小数点実装を選択できます。この新しいオプションは、バージョン 5 の場合はデフォルトで
softfloat、バージョン 6 と 7 の場合はhardfloatがデフォルトです。
Loong64
loong64ポートでは、関数の引数と結果をレジスタを使用して渡すことがサポートされるようになりました。linux/loong64ポートでは、アドレスサニタイザ、メモリサニタイザ、新しいスタイルのリンカリロケーション、およびプラグインビルドモードがサポートされるようになりました。
OpenBSD
- Go 1.22 では、OpenBSD のビッグエンディアン 64-bit PowerPC(
openbsd/ppc64)向けの実験的なポートが追加されました。