前書き
Go1.22のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.22 Release Notes
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
)向けの実験的なポートが追加されました。