前書き
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のリリースでは、以下のGOOS
がunix
制約を満たします:
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_CFLAGS
、CGO_CPPFLAGS
、CGO_CXXFLAGS
、CGO_FFLAGS
、CGO_LDFLAGS
、GOGCCFLAGS
変数にスペースが含まれる場合、そのエントリが引用符で囲まれるようになりました。
go list -json
JSONフィールドのカンマ区切りリストを指定できるようになりました。
リストが指定された場合、JSON出力には指定されたフィールドのみが含まれ、指定されていないフィールドを計算する処理が省略されます。
この機能により、一部のエラーが抑制される場合があります。
モジュール情報のキャッシュ
go
コマンドが、一部のモジュールをロードするために必要な情報をキャッシュするようになりました。
これにより、go list
の一部の呼び出しが高速化されることが期待されます。
Vet
vet
チェッカーの「errorsas」は、errors.As
が第2引数として*error
型を受け取る場合に警告を報告するようになりました。
これは一般的な間違いです。
ランタイム
ソフトメモリ制限のサポート
ランタイムにソフトメモリ制限のサポートが追加されました。
このメモリ制限にはGoヒープやランタイムが管理するその他のメモリが含まれますが、バイナリ自体のマッピング、他の言語で管理されるメモリ、Goプログラムに代わってオペレーティングシステムが保持するメモリなどの外部メモリは含まれません。
この制限は runtime/debug.SetMemoryLimit
関数または環境変数 GOMEMLIMIT
を使用して管理できます。
この制限は runtime/debug.SetGCPercent
や GOGC
と連携して動作し、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
に変換する必要がなくなります。
さらに、Int64
とUint64
は、32ビットシステム上でも構造体やメモリ割り当てにおいて自動的に64ビット境界にアラインされます。
PATH検索の変更
カレントディレクトリを基準とするPATH検索の廃止
Command
と LookPath
は、PATH検索でカレントディレクトリ(.
)を基準にした結果を許可しなくなりました。
この変更により、一般的なセキュリティ問題が解消
されます。
ただし、カレントディレクトリに存在するバイナリ(例えば、exec.Command("prog")
でprog
を実行するケース)に依存する既存のプログラムは動作しなくなる可能性があります。
こうしたプログラムを更新する方法については、os/exec
パッケージのドキュメントを参照してください。
Windowsでの NoDefaultCurrentDirectoryInExePath 環境変数の対応
Windowsでは、Command
とLookPath
が NoDefaultCurrentDirectoryInExePath
環境変数を考慮するようになりました。
これにより、PATH検索でデフォルトのカレントディレクトリ(.
)を無効にすることが可能です。
この変更により、Windowsシステム上でのPATH検索の挙動をより細かく制御できるようになります。
ライブラリの細かい変更
全体の更新
Go バージョン1の互換性の約束
を維持しつつ、ライブラリにはさまざまな小さな変更と更新が加えられています。
また、ここでは列挙されていませんが、いくつかのパフォーマンス向上も行われています。
archive/zip
- 非ZIPデータの無視
Reader は、ZIPファイルの先頭にある非ZIPデータを無視するようになりました。
他の多くの実装と一致する動作であり、一部のJava JARファイルを読み取るために必要な変更です。
crypto/elliptic
-
無効な曲線ポイントの操作
無効な曲線ポイント(IsOnCurve
メソッドがfalse
を返すポイント)での操作は、常に未定義の動作と見なされていました。
このようなポイントは、Unmarshal
や有効なポイントを操作するCurve
メソッドからは返されませんが、Marshal 、MarshalCompressed 、Add 、Double 、ScalarMult に無効なポイントが渡されると、これらの関数はパニックを引き起こすようになりました。
これにより、キー回復攻撃のリスクが軽減されます。 -
ScalarBaseMultの高速化
P224、P384、P521曲線でのScalarBaseMult
操作が最大3倍高速化されました。
この変更により、一部のECDSA操作も同様の高速化が実現されています。 -
P256の一般実装の更新
一般的な(プラットフォーム最適化されていない)P256実装が形式的に検証されたモデルに基づくものに置き換えられました。
この変更により、32ビットプラットフォームでの処理が大幅に遅くなる可能性があります。
crypto/rand
-
ランダムデータのバッファリング廃止
Read は、オペレーティングシステムから取得したランダムデータを呼び出し間でバッファリングしなくなりました。
高頻度で小さな読み取りを行うアプリケーションでは、Reader をbufio.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の変更
SignatureAlgorithm
をMD5WithRSA
に設定した証明書の作成がサポートされなくなりました。
負のシリアル番号が受け付けられなくなりました。
拡張がない証明書を作成する際に、空のSEQUENCE
を出力しなくなりました。 -
x509sha1=1 オプションの削除延期
Go 1.19で予定されていたGODEBUGオプションx509sha1=1
の削除は、将来のリリースに延期されました。
このオプションを使用しているアプリケーションは、移行に取り組むべきです。
SHA-1に対する実用的な攻撃は2017年から実証されており、公開信頼された認証局は2015年以降SHA-1証明書を発行していません。 -
重複拡張の拒否
ParseCertificate とParseCertificateRequest は、重複する拡張を含む証明書やCSRを拒否するようになりました。 -
新しい CertPool メソッド
CertPool.Clone :CertPool
のクローンを作成します。
CertPool.Equal : 2つのCertPool
が等価であるか確認します。 -
新しいCRL解析機能
新しい関数ParseRevocationList は、高速かつ安全なCRLパーサを提供し、RevocationList を返します。
CRLを解析すると、新しいRevocationList
フィールド(RawIssuer
、Signature
、AuthorityKeyId
、Extensions
)が埋められます。これらはCreateRevocationList では無視されます。
新しいメソッドRevocationList.CheckSignatureFrom
は、CRLの署名が証明書からの有効な署名であるかを確認します。 -
非推奨のCRL機能
ParseCRL とParseDERCRL は非推奨となり、ParseRevocationList
が推奨されます。
Certificate.CheckCRLSignature メソッドは非推奨となり、RevocationList.CheckSignatureFrom
が推奨されます。 -
Certificate.Verifyの改良
パスビルダーが改良され、複雑なシナリオでより良いチェーンを生成したり、効率的に動作したりするようになりました。
名前制約が非リーフ証明書にも適用されるようになりました。
crypto/x509/pkix
- 型の非推奨化
CertificateList とTBSCertificateList 型が非推奨となりました。
新しいcrypto/x509のCRL機能 を使用することが推奨されます。
debug/elf
- 新しい定数の追加
EM_LOONGARCH
とR_LARCH_*
定数が追加され、loong64
ポートをサポートします。
debug/pe
- 新しいメソッドの追加
File.COFFSymbolReadSectionDefAux メソッドが追加されました。このメソッドはCOFFSymbolAuxFormat5 を返し、PEファイルセクション内のCOMDAT情報へのアクセスを提供します。
新しいIMAGE_COMDAT_*
およびIMAGE_SCN_*
定数がこれをサポートします。
encoding/binary
-
新しいインターフェース AppendByteOrder
このインターフェースは、uint16
、uint32
、uint64
をバイトスライスに効率的に追加するメソッドを提供します。
BigEndian とLittleEndian がこのインターフェースを実装します。 -
新しい関数 AppendUvarint と AppendVarint
PutUvarint とPutVarint の効率的な追加バージョンです。
encoding/csv
- 新しいメソッドReader.InputOffset
現在の入力位置をバイトオフセットとして報告する新しいメソッドが追加されました。これは、encoding/json
のDecoder.InputOffset に類似しています。
encoding/xml
- 新しいメソッド Decoder.InputPos
現在の入力位置を行と列で報告する新しいメソッドが追加されました。これは、encoding/csv
のDecoder.FieldPos に類似しています。
flag
- 新しい関数TextVar
encoding.TextUnmarshaler を実装する値を持つフラグを定義するための新しい関数です。これにより、コマンドラインフラグ変数でbig.Int 、netip.Addr 、time.Time のような型を使用できるようになります。
fmt
go/parser
- 単項式 ~x の認識
パーサーが~x
を単項式として認識するようになり、演算子token.TILDE を用いた式が解析されます。
これにより、~int
のような型制約が不適切な文脈で使用された場合のエラーリカバリが改善されました。
go/types
-
新しいメソッド Func.Origin と Var.Origin
型インスタンス化中に作成される合成された Func および Var オブジェクトに対し、それらに対応するジェネリック型のObject を返します。 -
無限ループの防止
再帰的なNamed.Underlying またはNamed.Method の呼び出しを通じて、無限に区別可能だが同一のNamed 型インスタンスを生成することができなくなりました。
hash/maphash
- 新しい関数 Bytes
と String
これらの関数は、単一のバイトスライスや文字列を効率的にハッシュ化する方法を提供します。
これらは、一般的なHash を1回の書き込みで使用するのと同等ですが、小さな入力に対するセットアップオーバーヘッドを回避します。
html/template
-
FuncMap のエイリアス化
FuncMap 型は独自の型ではなく、text/template
のFuncMap のエイリアスとなりました。
これにより、どちらの設定でもFuncMap
を操作するコードを書くことが可能になります。 -
ES6テンプレートリテラルの動作制限
Go 1.19.8以降では、ECMAScript 6テンプレートリテラル内のアクションが許可されなくなりました 。
この動作は、GODEBUG=jstmpllitinterp=1
を設定することで元に戻すことができます。
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.Resolver やResolver.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
フィールドとnil
のEnv
を持つCmd は、サブプロセスのPWD
環境変数をDir
に一致するように暗黙的に設定するようになりました。 -
新しいメソッドCmd.Environ
コマンド実行時に使用される環境変数(暗黙的に設定されるPWD
変数を含む)を報告する新しいメソッドが追加されました。
reflect
-
Value.Bytes メソッドの拡張
スライスに加えて、アドレス指定可能な配列も受け入れるようになりました。 -
Value.Len とValue.Cap メソッドの改善
配列のポインタに対して正常に動作し、その配列の長さを返すようになりました。この挙動は組み込み関数 len および cap と一致します 。
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サイクルを報告します。詳細はランタイムのノート を参照してください。
- /sched/gomaxprocs:threads
runtime/pprof
-
ガルーチンプライバル収集の停止時間短縮
ガルーチンプライバルを収集する際の「Stop-the-world」停止時間が大幅に短縮され、アプリケーションへの全体的な遅延影響が軽減されました。 -
MaxRSS のヒーププロファイルへの追加
すべてのUnixオペレーティングシステムで、ヒーププロファイルにMaxRSS
(最大常駐セットサイズ)が報告されるようになりました(以前はGOOS=android
、darwin
、ios
、linux
でのみ報告されていました)。
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
Find はSearch に似ていますが、より使いやすい場合があります。
この関数は、等しい値が見つかったかどうかを示す追加のブール値を返します。
strconv
- Quote
関数の変更
Quote
および関連する関数は、ルーンU+007F
を\u007f
ではなく\x7f
として引用するようになりました。他のASCII値との一貫性を保つための変更です。
syscall
-
PowerPCでの変更
PowerPC(GOARCH=ppc64
,ppc64le
)では、Syscall 、Syscall6 、RawSyscall 、およびRawSyscall6 が戻り値r2
に未定義値ではなく常に0
を返すようになりました。 -
Getrusage の定義
AIXおよびSolarisでGetrusage
が定義されました。
time
-
新しいメソッド Duration.Abs
新しいメソッドDuration.Abs
が追加され、持続時間の絶対値を便利かつ安全に取得できるようになりました。
これにより、-2⁶³
を2⁶³−1
に変換します(ゼロ時刻から最近の時刻を引いた結果として、この境界ケースが発生する可能性があります)。 -
新しいメソッド Time.ZoneBounds
指定された時刻に有効なタイムゾーンの開始時刻と終了時刻を返す新しいメソッドです。
このメソッドは、ループ内で使用して指定された場所のすべてのタイムゾーン遷移を列挙することができます。