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

JavaScriptを有効にしてください

前書き

Go1.19のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.19 Release Notes

Go 1.19の紹介

最新のGoリリースであるバージョン1.19は、前バージョン1.18のリリースから5か月後に公開されました。
このリリースの変更点の多くは、ツールチェーン、ランタイム、ライブラリの実装に関するものです。
これまでと同様に、Go バージョン1の互換性に関する約束は維持されています。
ほとんどのGoプログラムは、これまで通り問題なくコンパイル・実行できると予想されます。

言語の変更

言語に関する変更は1点のみで、メソッド宣言における型パラメータのスコープに関する非常に小さな修正が行われました。
この変更による既存のプログラムへの影響はありません。

メモリモデル

Goのメモリモデルが更新され、C、C++、Java、JavaScript、Rust、Swiftで採用されているメモリモデルと整合性が取られるようになりました。
Goでは、他の言語で見られるような緩やかな形式ではなく、順序付けられた一貫性のあるアトミック操作のみを提供します。

このメモリモデルの更新に加え、Go 1.19ではsync/atomicパッケージに新しい型が導入されました。
これにより、atomic.Int64やatomic.Pointer[T]などのアトミック値を扱うのがより簡単になります。

LoongArch 64ビット

Go 1.19では、Linux(GOOS=linux、GOARCH=loong64)上でLoongson 64ビットアーキテクチャ(LoongArch)がサポートされました。
実装されたABIはLP64Dです。対応する最小カーネルバージョンは5.19です。

ただし、LoongArch向けの既存の多くの商用Linuxディストリビューションは、歴史的に互換性のないシステムコールABIを持つ古いカーネルを使用しています。
そのため、コンパイルされたバイナリは静的リンクされている場合でも、これらのシステム上では動作しません。
このような非対応システムのユーザーは、ディストリビューションが提供するGoパッケージに制限されます。

RISC-V

riscv64ポートでは、関数の引数と戻り値をレジスタで渡すことがサポートされるようになりました。
ベンチマークテストによると、riscv64での性能が10%以上向上することが示されています。

ツール

ドキュメントコメント

Go 1.19では、ドキュメントコメントにリンク、リスト、そしてより明確な見出しのサポートが追加されました。
この変更の一環として、gofmtがドキュメントコメントを再フォーマットし、表示される意味をより明確にします。
詳細な構文や、gofmtによって強調される一般的な誤りについては、「Go Doc Comments 」を参照してください。

また、この変更の一環として、新しいパッケージ go/doc/comment が追加されました。
このパッケージでは、ドキュメントコメントの解析や再フォーマットを行い、HTML、Markdown、テキスト形式でのレンダリングをサポートします。

新しいunixビルド制約

unixビルド制約が//go:build行で認識されるようになりました。
この制約は、ターゲットオペレーティングシステム(GOOSとしても知られる)がUnixまたはUnix系システムの場合に満たされます。

Go 1.19のリリースでは、以下のGOOSunix制約を満たします:

  • aix
  • android
  • darwin
  • dragonfly
  • freebsd
  • hurd
  • illumos
  • ios
  • linux
  • netbsd
  • openbsd
  • solaris

将来のリリースでは、新たにサポートされるオペレーティングシステムにもunix制約が適用される可能性があります。

Go コマンド

-trimpathフラグ

go buildで生成されるGoバイナリのビルド設定に、-trimpathフラグが含まれるようになりました。
この設定は、go version -m または debug.ReadBuildInfo を使用して確認できます。

go generate

生成器の環境でGOROOT環境変数が明示的に設定されるようになりました。
これにより、-trimpathでビルドされた場合でも、生成器が正しいGOROOTを見つけられるようになります。

go testとgo generate

サブプロセスで使用されるPATHの先頭にGOROOT/binを配置するようになりました。
これにより、テストや生成器がgoコマンドを実行する際に、同じGOROOTを解決できるようになります。

go env

出力されるCGO_CFLAGSCGO_CPPFLAGSCGO_CXXFLAGSCGO_FFLAGSCGO_LDFLAGSGOGCCFLAGS変数にスペースが含まれる場合、そのエントリが引用符で囲まれるようになりました。

go list -json

JSONフィールドのカンマ区切りリストを指定できるようになりました。
リストが指定された場合、JSON出力には指定されたフィールドのみが含まれ、指定されていないフィールドを計算する処理が省略されます。
この機能により、一部のエラーが抑制される場合があります。

モジュール情報のキャッシュ

goコマンドが、一部のモジュールをロードするために必要な情報をキャッシュするようになりました。
これにより、go listの一部の呼び出しが高速化されることが期待されます。

Vet

vetチェッカーの「errorsas」は、errors.As が第2引数として*error型を受け取る場合に警告を報告するようになりました。
これは一般的な間違いです。

ランタイム

ソフトメモリ制限のサポート

ランタイムにソフトメモリ制限のサポートが追加されました。
このメモリ制限にはGoヒープやランタイムが管理するその他のメモリが含まれますが、バイナリ自体のマッピング、他の言語で管理されるメモリ、Goプログラムに代わってオペレーティングシステムが保持するメモリなどの外部メモリは含まれません。
この制限は runtime/debug.SetMemoryLimit 関数または環境変数 GOMEMLIMIT を使用して管理できます。

この制限は runtime/debug.SetGCPercentGOGC と連携して動作し、GOGC=offの場合でも適用されます。
これにより、Goプログラムがメモリ制限を最大限に活用できるようになり、リソース効率が向上します。
詳細な説明や一般的なユースケースについては、GCガイド を参照してください。

注意として、数十メガバイト程度の小さいメモリ制限は、OSのスケジューリングなどの外部要因により、必ずしも守られない場合があります。
一方で、数百メガバイト以上の大きなメモリ制限は安定しており、本番環境でも使用可能です(詳細はissue 52433 を参照してください)。

GCスラッシングの抑制

プログラムのライブヒープサイズがソフトメモリ制限に近づいた際に発生するGCスラッシングを抑えるため、ランタイムはGCのCPU使用率を50%に制限しようとします(アイドル時間は除く)。
これにより、アプリケーションの進行を阻害することなく、より多くのメモリを使用する選択を行います。
この制限は例外的なケースでのみ役割を果たすと想定されており、発生時は新しいランタイムメトリクス /gc/limiter/last-enabled:gc-cycleで確認できます。

アイドル時のGCスレッド削減

アプリケーションが十分にアイドル状態で定期的なGCサイクルを強制される場合、ランタイムはアイドル状態のOSスレッドでスケジュールされるGCワーカーゴルーチンの数を大幅に削減するようになりました。

ゴルーチンの初期スタックサイズの調整

ランタイムは、ゴルーチンの歴史的な平均スタック使用量に基づいて初期スタックを割り当てるようになりました。
これにより、平均的なケースで必要だった初期スタックの成長やコピーを回避しますが、平均を下回るゴルーチンにおいて最大で2倍のメモリ空間を無駄にする可能性があります。

Unix系OSでのファイルディスクリプタ制限の引き上げ

パッケージos をインポートするGoプログラムは、Unix系OSで自動的にオープンファイル制限(RLIMIT_NOFILE)を最大許容値まで引き上げます。
具体的には、ソフトリミットをハードリミットに一致させます。これは、select システムコールを使用する古いCプログラムとの互換性のために、一部のシステムで人工的に設定されていた低いリミットを修正するものです。
このリミットはGoプログラムには適しておらず、gofmtのような単純なプログラムでも多くのファイルを並列処理する際にファイルディスクリプタが不足する問題を引き起こしていました。
この変更に伴い、Goプログラムが非常に古いCプログラムを子プロセスとして実行する場合、ファイルディスクリプタのリミットが高すぎる可能性があります。
この問題は、Goプログラムを呼び出す前にハードリミットを設定することで修正できます。

致命的エラーのトレースバックの簡略化

回復不能な致命的エラー(例: 同時マップ書き込みや未ロックのミューテックスのロック解除)が発生した場合、GOTRACEBACK=systemまたはcrashが設定されていない限り、ランタイムメタデータを含まない簡略化されたトレースバックが表示されます(致命的なパニックと同等)。
ただし、ランタイム内部の致命的エラーに関しては、GOTRACEBACKの値に関わらず常に完全なメタデータが含まれます。

ARM64でのデバッガ挿入関数呼び出しのサポート

ARM64では、デバッガが挿入する関数呼び出しをサポートするようになりました。
これにより、対応するデバッガを使用している場合、インタラクティブなデバッグセッションでバイナリ内の関数を呼び出すことが可能です。

アドレスサニタイザの改良

Go 1.18で導入されたアドレスサニタイザのサポート が強化され、関数の引数やグローバル変数をより正確に処理するようになりました。

コンパイラ

大規模な switch 文の最適化

コンパイラは、大きな整数や文字列のswitch文を実装する際にジャンプテーブル を使用するようになりました。
これにより、switch文の性能が約20%向上する場合があります(GOARCH=amd64およびGOARCH=arm64でのみ適用)。

-p=importpathフラグの必須化

Goコンパイラでリンク可能なオブジェクトファイルをビルドする際、-p=importpathフラグが必要になりました。
このフラグは、goコマンドやBazelで既に提供されていますが、Goコンパイラを直接呼び出す他のビルドシステムでは、このフラグを必ず渡す必要があります。

-importmapフラグの廃止

Goコンパイラは、-importmapフラグを受け付けなくなりました。
代わりに、ビルドシステムは-importcfgフラグを使用する必要があります。

アセンブラ

-p=importpathフラグの必須化

コンパイラと同様に、アセンブラでもリンク可能なオブジェクトファイルをビルドする際に-p=importpathフラグが必要です。
このフラグはgoコマンドで既に提供されていますが、Goアセンブラを直接呼び出す他のビルドシステムでは、このフラグを必ず渡す必要があります。

リンカ

ELFプラットフォームでの圧縮DWARFセクション

ELFプラットフォームでは、リンカがレガシー形式である.zdebug形式の代わりに、標準のgABI形式(SHF_COMPRESSED)で圧縮されたDWARFセクションを出力するようになりました。

標準ライブラリ

新しいアトミック型

sync/atomicパッケージに、新しいアトミック型が追加されました:

これらの型は、基盤となる値を隠蔽し、すべてのアクセスをアトミックAPI経由で強制的に行わせることで安全性を向上させます。
また、Pointer 型を使用すると、呼び出し箇所でunsafe.Pointer に変換する必要がなくなります。
さらに、Int64Uint64は、32ビットシステム上でも構造体やメモリ割り当てにおいて自動的に64ビット境界にアラインされます。

PATH検索の変更

カレントディレクトリを基準とするPATH検索の廃止

CommandLookPath は、PATH検索でカレントディレクトリ(.)を基準にした結果を許可しなくなりました。
この変更により、一般的なセキュリティ問題が解消 されます。
ただし、カレントディレクトリに存在するバイナリ(例えば、exec.Command("prog")progを実行するケース)に依存する既存のプログラムは動作しなくなる可能性があります。
こうしたプログラムを更新する方法については、os/exec パッケージのドキュメントを参照してください。

Windowsでの NoDefaultCurrentDirectoryInExePath 環境変数の対応

Windowsでは、CommandLookPathNoDefaultCurrentDirectoryInExePath 環境変数を考慮するようになりました。
これにより、PATH検索でデフォルトのカレントディレクトリ(.)を無効にすることが可能です。
この変更により、Windowsシステム上でのPATH検索の挙動をより細かく制御できるようになります。

ライブラリの細かい変更

全体の更新

Go バージョン1の互換性の約束 を維持しつつ、ライブラリにはさまざまな小さな変更と更新が加えられています。
また、ここでは列挙されていませんが、いくつかのパフォーマンス向上も行われています。

archive/zip

  • 非ZIPデータの無視
    Reader は、ZIPファイルの先頭にある非ZIPデータを無視するようになりました。
    他の多くの実装と一致する動作であり、一部のJava JARファイルを読み取るために必要な変更です。

crypto/elliptic

  • 無効な曲線ポイントの操作
    無効な曲線ポイント(IsOnCurveメソッドがfalseを返すポイント)での操作は、常に未定義の動作と見なされていました。
    このようなポイントは、Unmarshalや有効なポイントを操作するCurveメソッドからは返されませんが、MarshalMarshalCompressedAddDoubleScalarMult に無効なポイントが渡されると、これらの関数はパニックを引き起こすようになりました。
    これにより、キー回復攻撃のリスクが軽減されます。

  • ScalarBaseMultの高速化
    P224、P384、P521曲線でのScalarBaseMult操作が最大3倍高速化されました。
    この変更により、一部のECDSA操作も同様の高速化が実現されています。

  • P256の一般実装の更新
    一般的な(プラットフォーム最適化されていない)P256実装が形式的に検証されたモデルに基づくものに置き換えられました。
    この変更により、32ビットプラットフォームでの処理が大幅に遅くなる可能性があります。

crypto/rand

  • ランダムデータのバッファリング廃止
    Read は、オペレーティングシステムから取得したランダムデータを呼び出し間でバッファリングしなくなりました。
    高頻度で小さな読み取りを行うアプリケーションでは、Readerbufio.Reader でラップし、io.ReadFull を使用して部分的な読み取りが発生しないようにすることが推奨されます。

  • Plan 9での再実装
    Plan 9では、Readが再実装され、ANSI X9.31アルゴリズムの代わりに高速なキー消去ジェネレータが使用されるようになりました。

  • Primeの実装変更
    Prime の実装が拒否サンプリングのみを使用するよう変更されました。
    この変更により、非暗号化用途での小さな素数生成におけるバイアスが排除され、軽微なタイミングリークの可能性が取り除かれ、BoringSSLとの挙動がより一致します。 同時に実装が簡素化されました。
    この変更により、以前の実装と異なるランダムソースストリームから異なる出力が生成される場合があります。
    特定の決定論的ランダムソースから特定の結果を期待するテストが失敗する可能性があります。
    将来こうした問題を防ぐため、入力ストリームに対して意図的に非決定論的な実装になっています。

crypto/tls

  • tls10default=1オプションの削除
    GODEBUGオプションtls10default=1が削除されました。
    ただし、クライアント側でTLS 1.0を有効にするには、Config.MinVersion を設定することで引き続き可能です。

  • TLSハンドシェイクでの重複拡張の拒否
    TLSサーバーとクライアントは、RFC 5246セクション7.4.1.4およびRFC 8446セクション4.2で要求される通り、TLSハンドシェイク中に重複する拡張を拒否するようになりました。

crypto/x509

  • CreateCertificateの変更
    SignatureAlgorithmMD5WithRSAに設定した証明書の作成がサポートされなくなりました。
    負のシリアル番号が受け付けられなくなりました。
    拡張がない証明書を作成する際に、空のSEQUENCEを出力しなくなりました。

  • x509sha1=1 オプションの削除延期
    Go 1.19で予定されていたGODEBUGオプションx509sha1=1の削除は、将来のリリースに延期されました。
    このオプションを使用しているアプリケーションは、移行に取り組むべきです。
    SHA-1に対する実用的な攻撃は2017年から実証されており、公開信頼された認証局は2015年以降SHA-1証明書を発行していません。

  • 重複拡張の拒否
    ParseCertificateParseCertificateRequest は、重複する拡張を含む証明書やCSRを拒否するようになりました。

  • 新しい CertPool メソッド
    CertPool.Clone : CertPoolのクローンを作成します。
    CertPool.Equal : 2つのCertPoolが等価であるか確認します。

  • 新しいCRL解析機能
    新しい関数ParseRevocationList は、高速かつ安全なCRLパーサを提供し、RevocationList を返します。
    CRLを解析すると、新しいRevocationListフィールド(RawIssuerSignatureAuthorityKeyIdExtensions)が埋められます。これらはCreateRevocationList では無視されます。
    新しいメソッドRevocationList.CheckSignatureFromは、CRLの署名が証明書からの有効な署名であるかを確認します。

  • 非推奨のCRL機能
    ParseCRLParseDERCRL は非推奨となり、ParseRevocationListが推奨されます。
    Certificate.CheckCRLSignature メソッドは非推奨となり、RevocationList.CheckSignatureFromが推奨されます。

  • Certificate.Verifyの改良
    パスビルダーが改良され、複雑なシナリオでより良いチェーンを生成したり、効率的に動作したりするようになりました。
    名前制約が非リーフ証明書にも適用されるようになりました。

crypto/x509/pkix

debug/elf

  • 新しい定数の追加
    EM_LOONGARCHR_LARCH_*定数が追加され、loong64ポートをサポートします。

debug/pe

  • 新しいメソッドの追加
    File.COFFSymbolReadSectionDefAux メソッドが追加されました。このメソッドはCOFFSymbolAuxFormat5 を返し、PEファイルセクション内のCOMDAT情報へのアクセスを提供します。
    新しいIMAGE_COMDAT_*およびIMAGE_SCN_*定数がこれをサポートします。

encoding/binary

encoding/csv

  • 新しいメソッドReader.InputOffset
    現在の入力位置をバイトオフセットとして報告する新しいメソッドが追加されました。これは、encoding/jsonDecoder.InputOffset に類似しています。

encoding/xml

  • 新しいメソッド Decoder.InputPos
    現在の入力位置を行と列で報告する新しいメソッドが追加されました。これは、encoding/csvDecoder.FieldPos に類似しています。

flag

fmt

  • 新しい関数AppendAppendfAppendln
    フォーマット済みデータをバイトスライスに追加する新しい関数が追加されました。

go/parser

  • 単項式 ~x の認識
    パーサーが~xを単項式として認識するようになり、演算子token.TILDE を用いた式が解析されます。
    これにより、~intのような型制約が不適切な文脈で使用された場合のエラーリカバリが改善されました。

go/types

  • 新しいメソッド Func.OriginVar.Origin
    型インスタンス化中に作成される合成された Func および Var オブジェクトに対し、それらに対応するジェネリック型のObject を返します。

  • 無限ループの防止
    再帰的なNamed.Underlying またはNamed.Method の呼び出しを通じて、無限に区別可能だが同一のNamed 型インスタンスを生成することができなくなりました。

hash/maphash

  • 新しい関数 BytesString
    これらの関数は、単一のバイトスライスや文字列を効率的にハッシュ化する方法を提供します。
    これらは、一般的なHash を1回の書き込みで使用するのと同等ですが、小さな入力に対するセットアップオーバーヘッドを回避します。

html/template

image/draw

  • Src オペレーターでのアルファカラーの保持
    Src オペレーターを使用して描画 する際、宛先画像とソース画像の両方がimage.NRGBA またはimage.NRGBA64 である場合、非プリマルチプライドアルファカラーが保持されるようになりました。
    この変更は、Go 1.18のライブラリ最適化によって誤って導入された動作変更を元に戻すものであり、コードはGo 1.17以前の動作と一致します。

io

  • NopCloser の変更
    NopCloser の結果が、その入力が実装する場合に限りWriterTo インターフェースを実装するようになりました。

  • MultiReader の変更
    MultiReader の結果は、無条件でWriterTo インターフェースを実装するようになりました。
    基になるリーダーがWriterToを実装していない場合は、適切にシミュレーションされます。

mime

  • Windowsでの .js 拡張子のMIMEタイプ
    Windowsにおいて、.js拡張子にMIMEタイプtext/plainを割り当てるレジストリエントリを無視するようになりました。
    この設定ミスはWindowsシステムで一般的に発生します。
    この変更により、.jsはデフォルトでtext/javascript; charset=utf-8として扱われます。
    Windows上でtext/plainを期待するアプリケーションは、明示的にAddExtensionType を呼び出す必要があります。

mime/multipart

  • MIMEデータのサイズ制限
    Go 1.19.8以降、このパッケージでは悪意のある入力から保護するために、処理するMIMEデータのサイズに制限を設定するようになりました。
    Reader.NextPartおよびReader.NextRawPartでは、1つのパート内のヘッダー数を最大10000までに制限します。
    Reader.ReadFormでは、すべてのFileHeaders内のヘッダー総数を最大10000に制限し、フォーム内のパーツ数を最大1000に制限します。
    これらの制限は、環境変数GODEBUG=multipartmaxheadersおよびGODEBUG=multipartmaxpartsで調整できます。

net

  • 純GoリゾルバのEDNS(0)サポート
    純GoリゾルバがEDNS(0)を使用するようになり、提案される最大応答パケット長が1232バイトまで許容されるようになりました(従来は512バイトが上限)。
    ローカルDNSリゾルバで問題が発生する可能性は低いですが、その場合、環境変数GODEBUG=netdns=cgoを設定してcgoベースのリゾルバを使用することで対処できます。
    このような問題が発生した場合は、issueトラッカー で報告してください。

  • エラーハンドリングの改善
    netパッケージの関数やメソッドが"I/O timeout"エラーを返す場合、そのエラーはerrors.Is(err, context.DeadlineExceeded)を満たすようになりました。
    “operation was canceled"エラーを返す場合、そのエラーはerrors.Is(err, context.Canceled)を満たすようになりました。
    これらの変更により、contextのキャンセルやタイムアウトが原因でエラーが発生した場合に、それをテストするコードが簡単になります。
    エラーメッセージの後方互換性は維持されています。

  • Resolver.PreferGo のWindowsおよびPlan 9対応
    Resolver.PreferGo がWindowsとPlan 9でサポートされるようになりました(以前はUnixプラットフォームのみ対応)。
    Dialer.ResolverResolver.Dial と組み合わせることで、ポータブルなプログラムを作成し、名前解決を完全に制御できるようになります。

  • Windowsでの netgo ビルドタグの初期サポート
    Windowsでnetgoビルドタグを使用すると、WindowsにDNS結果を要求する代わりに、Resolver.PreferGoで使用されるGo DNSクライアントを利用するようになります。
    ただし、Windowsから取得するアップストリームDNSサーバー情報は、複雑なシステムネットワーク構成では正確でない可能性があります。

net/http

  • ResponseWriter.WriteHeader の変更
    ユーザー定義の1xx情報ヘッダーを送信することをサポートしました。

  • MaxBytesReader のエラーハンドリング
    MaxBytesReaderが返すio.ReadCloserは、読み取り制限を超えた場合に定義済みのエラー型MaxBytesError を返すようになりました。

  • Location ヘッダーのない3xxレスポンスの扱い
    HTTPクライアントはLocationヘッダーのない3xxレスポンスをエラーとして扱わず、呼び出し元にそのまま返します。

net/url

  • 新しいJoinPath 関数とURL.JoinPath メソッド
    パス要素のリストを結合して新しいURL を作成するための新しい関数とメソッドが追加されました。

  • 権限(authority)の有無の区別
    URL型は、権限がないURLと空の権限を持つURLを区別するようになりました。
    例: http:///pathは空の権限(ホスト)を持ちます。
    一方で、http:/pathは権限を持ちません。

  • 新しいURL.OmitHostフィールド
    URLが空の権限を持つ場合、このフィールドはtrueに設定されます。

os/exec

  • PWD 環境変数の自動設定
    空ではないDirフィールドとnilEnvを持つCmd は、サブプロセスのPWD環境変数をDirに一致するように暗黙的に設定するようになりました。

  • 新しいメソッドCmd.Environ
    コマンド実行時に使用される環境変数(暗黙的に設定されるPWD変数を含む)を報告する新しいメソッドが追加されました。

reflect

regexp/syntax

  • 正規表現パーサのセキュリティ修正
    Go 1.18リリース候補1、Go 1.17.8、Go 1.16.15で、非常に深くネストされた正規表現を拒否するセキュリティ修正が導入されました。
    これらのパッチリリースでは、新しいAPIを導入しないため、この場合パーサはsyntax.ErrInternalError を返していました。
    Go 1.19では、より具体的なエラーsyntax.ErrNestingDepth が追加され、このエラーが返されるようになりました。

runtime

  • GOROOT 関数の変更
    バイナリが-trimpathフラグを設定してビルドされ、かつプロセス環境でGOROOT変数が設定されていない場合、GOROOT関数は"go"ではなく空文字列を返すようになりました。

runtime/metrics

  • 新しいメトリクス
    • /sched/gomaxprocs:threads
      現在のruntime.GOMAXPROCS の値を報告します。
    • /cgo/go-to-c-calls:calls
      GoからCへの呼び出し総数を報告します。このメトリクスはruntime.NumCgoCall 関数と同じ値を提供します。
    • /gc/limiter/last-enabled:gc-cycle
      GC CPUリミッターが有効になった最後のGCサイクルを報告します。詳細はランタイムのノート を参照してください。

runtime/pprof

  • ガルーチンプライバル収集の停止時間短縮
    ガルーチンプライバルを収集する際の「Stop-the-world」停止時間が大幅に短縮され、アプリケーションへの全体的な遅延影響が軽減されました。

  • MaxRSS のヒーププロファイルへの追加
    すべてのUnixオペレーティングシステムで、ヒーププロファイルにMaxRSS(最大常駐セットサイズ)が報告されるようになりました(以前はGOOS=androiddarwinioslinuxでのみ報告されていました)。

runtime/race

  • レースデテクタのアップグレード
    サポートされているすべてのプラットフォームで、レースデテクタがスレッドサニタイザのバージョンv3を使用するようアップグレードされました。
    ただし、windows/amd64およびopenbsd/amd64は引き続きv2を使用します。
    v2と比較して、v3は通常1.5倍から2倍の速度で動作し、使用メモリが半分に削減され、無制限のゴルーチンをサポートします。
    Linuxでは、レースデテクタの動作にはglibcバージョン2.17以上およびGNU binutilsバージョン2.26以上が必要です。

  • GOARCH=s390x でのサポート
    レースデテクタがGOARCH=s390xでサポートされるようになりました。

  • openbsd/amd64 でのサポート削除
    スレッドサニタイザの上流でopenbsd/amd64のレースデテクタサポートが削除されたため、v2以降に更新される可能性は低いです。

runtime/trace

  • トレースとCPUプロファイラ の統合
    トレースとCPUプロファイラが同時に有効になっている場合、実行トレースにCPUプロファイルサンプルが瞬時のイベントとして含まれるようになりました。

sort

  • 新しいソートアルゴリズム
    ソートアルゴリズムがパターン破壊型クイックソート に書き換えられ、いくつかの一般的なシナリオで高速化が実現されました。

  • 新しい関数 Find
    FindSearch に似ていますが、より使いやすい場合があります。
    この関数は、等しい値が見つかったかどうかを示す追加のブール値を返します。

strconv

  • Quote 関数の変更
    Quoteおよび関連する関数は、ルーンU+007F\u007fではなく\x7fとして引用するようになりました。他のASCII値との一貫性を保つための変更です。

syscall

  • PowerPCでの変更
    PowerPC(GOARCH=ppc64, ppc64le)では、SyscallSyscall6RawSyscall 、およびRawSyscall6 が戻り値r2に未定義値ではなく常に0を返すようになりました。

  • Getrusage の定義
    AIXおよびSolarisでGetrusageが定義されました。

time

  • 新しいメソッド Duration.Abs
    新しいメソッドDuration.Absが追加され、持続時間の絶対値を便利かつ安全に取得できるようになりました。
    これにより、-2⁶³2⁶³−1に変換します(ゼロ時刻から最近の時刻を引いた結果として、この境界ケースが発生する可能性があります)。

  • 新しいメソッド Time.ZoneBounds
    指定された時刻に有効なタイムゾーンの開始時刻と終了時刻を返す新しいメソッドです。
    このメソッドは、ループ内で使用して指定された場所のすべてのタイムゾーン遷移を列挙することができます。


スポンサーリンク

共有

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