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

JavaScriptを有効にしてください

前書き

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ループが整数を範囲として使用できるようになりました。以下はその例です:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package main

import "fmt"

func main() {
  for i := range 10 {
    fmt.Println(10 - i)
  }
  fmt.Println("go1.22 has lift-off!")
}

詳細は仕様 を参照してください。

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 buildgo 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呼び出しを遅延させる必要があります。例えば:

1
2
3
4
5
6
7
t := time.Now()
defer log.Println(time.Since(t)) // 非遅延呼び出し
tmp := time.Since(t); defer log.Println(tmp) // 前述の遅延呼び出しと同等

defer func() {
  log.Println(time.Since(t)) // 適切な遅延呼び出し
}()

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/randRead を代わりに使用するべきです。それ以外の場合、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 は、Int64NUint64N のようなものですが、任意の整数型で動作します。例えば、0から5分までのランダムな期間を取得するには rand.N(5 * time.Minute) と記述します。
  • math/randSource で提供されていた 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

SplitFuncErrFinalTokennil トークンと共に返すと、Scanner は即座に停止するようになりました。以前は、最終的な空のトークンが報告されてから停止していましたが、通常これは望ましくありませんでした。最終的な空のトークンを報告したい呼び出し元は、nil の代わりに []byte{} を返すことができます。

cmp

新しい関数 Or は、ゼロ値でない最初の値を返します。

crypto/tls

  • ConnectionState.ExportKeyingMaterial は、TLS 1.3 が使用されているか、サーバーとクライアントの両方が extended_master_secret 拡張をサポートしている場合にのみエラーを返すようになりました。crypto/tls は Go 1.20 からこの拡張をサポートしています。この動作は、tlsunsafeekm=1GODEBUG 設定で無効にできます。

  • crypto/tls サーバーが提供する最小バージョンは、デフォルトで TLS 1.2 になりました(config.MinimumVersion で指定しない限り)。これは、crypto/tls クライアントの挙動に一致します。この変更は、tls10server=1GODEBUG 設定で元に戻すことができます。

  • デフォルトでは、ECDHE をサポートしない暗号スイートは、TLS 1.3 より前のハンドシェイク時にクライアントまたはサーバーのいずれからも提供されなくなりました。この変更は、tlsrsakex=1GODEBUG 設定で元に戻すことができます。

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=1GODEBUG 設定を使用すると、これが反転し、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 型に新しく AppendEncodeAppendDecode メソッドが追加され、バイトスライスのエンコードとデコードが簡素化され、バイトスライスのバッファ管理が行われます。

  • base32.Encoding.WithPaddingbase64.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 型は型パラメータ情報も持つ予定です。新しい関数 UnaliasAlias 型(または他の型)の実際の型を返します。

  • 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.CopyTCPConn から UnixConn にコピーする際、可能であれば Linux の splice(2) システムコールを使用するようになり、TCPConn.WriteTo メソッドを新たに使用します。

  • -tags=netgo でビルドするとき、Go の DNS リゾルバは、DNS クエリを行う前に、Windows のホストファイル(%SystemRoot%\System32\drivers\etc\hosts)で一致する名前を検索するようになりました。

net/http

  • 新しい関数 ServeFileFSFileServerFS、および NewFileTransportFS は、fs.FS を操作する、既存の ServeFileFileServerNewFileTransport のバージョンです。

  • 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_SYMLINKIO_REPARSE_TAG_MOUNT_POINT の再解析ポイントのみを追跡していました。

  • Windows では、OpenFileO_SYNC を渡すと、書き込み操作が直接ディスクに書き込まれるようになり、Unix プラットフォームでの O_SYNC と同等になります。

  • Windows では、ReadDirFile.ReadDirFile.Readdir、および File.Readdirnames 関数がディレクトリエントリをバッチで読み込むようになり、システムコールの数が削減され、最大 30% のパフォーマンス向上が見込まれます。

  • io.CopyFile から 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.Mutexsync.RWMutex に加えて、ランタイム内部ロックに対する競合も含むようになりました。

runtime/pprof

  • ミューテックスのプロファイルは、ミューテックスにブロックされている goroutine の数によって競合をスケールします。これにより、ミューテックスが Go プログラムのボトルネックである程度をより正確に表現できるようになりました。例えば、100 の goroutine がミューテックスで 10 ミリ秒間ブロックされている場合、ミューテックスプロファイルは 10 ミリ秒の遅延ではなく、1 秒の遅延を記録します。

  • ミューテックスプロファイルは、sync.Mutexsync.RWMutex に加えて、ランタイム内部ロックに対する競合も含むようになりました。ランタイム内部ロックの競合は常に runtime._LostContendedRuntimeLock として報告されます。将来のリリースでは、これらのケースに対する完全なスタックトレースが追加される予定です。

  • Darwin プラットフォームでの CPU プロファイルは、プロセスのメモリマップを含むようになり、pprof ツールでの逆アセンブル表示が可能になります。

runtime/trace

  • 実行トレーサーが完全にオーバーホールされ、いくつかの長年の問題が解決され、新しいユースケースへの道が開かれました。

  • 実行トレーサーは、ほとんどのプラットフォーム(Windows を除く)でオペレーティングシステムのクロックを使用するようになり、低レベルコンポーネントが生成するトレースと相関させることが可能になりました。これにより、プラットフォームのクロックの信頼性に依存せず、正しいトレースを生成できます。

  • 実行トレーサーは、定期的にオン・ザ・フライでパーティション分けされるようになり、これによりストリームとして処理することが可能になりました。

  • 実行トレーサーには、すべてのシステムコールの完全な期間が含まれています。

  • 実行トレーサーには、goroutine が実行されたオペレーティングシステムスレッドに関する情報も含まれるようになりました。

  • 実行トレーサーの開始および停止の遅延影響が劇的に削減されました。

  • 実行トレーサーは、ガーベジコレクションのマークフェーズ中に開始または終了することができるようになりました。

  • Go 開発者がこれらの改善を活用できるように、実験的なトレース読み取りパッケージが golang.org/x/exp/trace にて提供されています。このパッケージは、Go 1.22 でビルドされたプログラムによって生成されたトレースでのみ動作することに注意してください。パッケージを試して、対応する提案の問題にフィードバックを提供してください。

  • 新しい実行トレーサー実装に問題が発生した場合、GOEXPERIMENT=noexectracer2 を使用して古い実装に戻すことができます。ただし、このオプションは将来的なリリースで削除される予定です。

slices

  • 新しい関数 Concat は、複数のスライスを連結します。

  • スライスのサイズを縮小する関数(DeleteDeleteFuncCompactCompactFuncReplace)は、現在、新しい長さと古い長さの間の要素をゼロにします。

  • Insert は、引数 i が範囲外である場合、常にパニックを引き起こします。以前は、挿入すべき要素がなかった場合に限り、パニックを引き起こしませんでした。

syscall

  • syscall パッケージは、Go 1.4 以降凍結され、Go 1.11 で非推奨としてマークされていました。このため、パッケージの使用に関して多くのエディタが警告を出していました。しかし、非推奨ではない機能も syscall パッケージを必要としています(例えば、os/exec.Cmd.SysProcAttr フィールド)。そのため、syscall パッケージは再び非推奨としてマークされなくなりました。ただし、新しい機能は凍結されたままであり、新しいコードでは可能な限り golang.org/x/sys/unixgolang.org/x/sys/windows を使用することが推奨されています。

  • Linux では、新しい SysProcAttr.PidFD フィールドにより、StartProcessos/exec を使用して子プロセスを起動する際に PID FD を取得できるようになりました。

  • Windows では、OpenO_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)向けの実験的なポートが追加されました。

スポンサーリンク

共有

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