まえがき
Go 1.18 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.18 Release Notes
次のバージョン:Go1.19のリリースノート(日本語訳)
前のバージョン:Go1.17のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.18の紹介
最新のGoリリース、バージョン1.18は、言語、ツールチェーンの実装、ランタイム、ライブラリに変更を含む重要なリリースです。Go 1.18はGo 1.17 の7か月後に登場しました。いつものように、このリリースはGo 1の互換性の約束 を維持しています。ほとんどすべてのGoプログラムがこれまで通りにコンパイルおよび実行されることを期待しています。
言語の変更
ジェネリクス
Go 1.18には、型パラメータ提案 で説明されているジェネリック機能の実装が含まれています。これは、言語に対する大きな変更ですが、完全に後方互換性があります。これらの新しい言語の変更には、実際の設定での大規模なテストが行われていない大量の新しいコードが必要でした。それは、より多くの人々がジェネリックコードを書いて使用するにつれてのみ起こります。この機能がよく実装され、高品質であると信じています。しかし、Goのほとんどの側面とは異なり、その信念を実世界の経験で裏付けることはできません。したがって、ジェネリクスを使用することをお勧めしますが、適切な注意を払って本番環境でジェネリックコードを展開してください。
新しい言語機能がよく設計され、明確に指定されていると信じていますが、間違いを犯した可能性があります。Go 1の互換性保証 は、「仕様の不整合または不完全性に対処する必要がある場合、問題の解決が既存のプログラムの意味または合法性に影響を与える可能性があります。そのような問題に対処する権利を留保します。実装の更新を含む」と述べています。また、「仕様に違反するバグがコンパイラまたはライブラリにある場合、バグが修正されると、バグのある動作に依存するプログラムが壊れる可能性があります。そのようなバグを修正する権利を留保します」とも述べています。言い換えれば、ジェネリクスを使用するコードが1.18リリースで動作するが、後のリリースで壊れる可能性があります。そのような変更を計画または期待していませんが、将来のリリースで1.18プログラムを壊すことが、今日予見できない理由で必要になる可能性があります。そのような破損を可能な限り最小限に抑えますが、破損がゼロになることを保証することはできません。
以下は、最も目に見える変更のリストです。より包括的な概要については、提案 を参照してください。詳細については、言語仕様 を参照してください。
関数
および型宣言
の構文は、型パラメータ
を受け入れるようになりました。パラメータ化された関数と型は、角括弧で型引数のリストを続けることでインスタンス化できます。新しいトークン~が演算子と句読点
のセットに追加されました。インターフェース型
の構文は、任意の型(インターフェースの型名だけでなく)の埋め込み、およびunionと~T型要素を許可するようになりました。そのようなインターフェースは、型制約としてのみ使用できます。インターフェースは、メソッドのセットだけでなく、型のセットも定義します。新しい事前宣言された識別子
anyは、空のインターフェースのエイリアスです。interface{}の代わりに使用できます。新しい事前宣言された識別子
comparableは、==または!=を使用して比較できるすべての型のセットを示すインターフェースです。型制約として(または埋め込まれて)使用することしかできません。
ジェネリクスを使用する3つの実験的なパッケージがあり、役立つかもしれません。これらのパッケージはx/expリポジトリにあり、そのAPIはGo 1の保証の対象ではなく、ジェネリクスの経験が増えるにつれて変更される可能性があります。
golang.org/x/exp/constraints
ジェネリックコードに役立つ制約、例えばconstraints.Ordered 。
golang.org/x/exp/slices
任意の要素型のスライスに対して操作を行うジェネリック関数のコレクション。
golang.org/x/exp/maps
任意のキーまたは要素型のマップに対して操作を行うジェネリック関数のコレクション。
現在のジェネリクス実装には、以下の既知の制限があります:
- Goコンパイラは、ジェネリック関数またはメソッド内の型宣言を処理できません。この機能のサポートを将来のリリースで提供することを希望しています。
- Goコンパイラは、事前宣言された関数
real、imag、およびcomplexに型パラメータ型の引数を受け入れません。この制限を将来のリリースで取り除くことを希望しています。 - Goコンパイラは、型パラメータ型
Pの値xに対してメソッドmを呼び出すことをサポートしているのは、mがPの制約インターフェースによって明示的に宣言されている場合のみです。同様に、メソッド値x.mおよびメソッド式P.mも、mがPによって明示的に宣言されている場合にのみサポートされます。mがPのメソッドセットに含まれている場合でも、P内のすべての型がmを実装しているためです。この制限を将来のリリースで取り除くことを希望しています。 - Goコンパイラは、型パラメータ型の
xがフィールドfを持っている場合でも、構造体フィールドx.fにアクセスすることをサポートしていません。この制限を将来のリリースで取り除くことを希望しています。 - 型パラメータまたは型パラメータへのポインタを構造体型の無名フィールドとして埋め込むことは許可されていません。同様に、型パラメータをインターフェース型に埋め込むことも許可されていません。これらが許可されるかどうかは現時点では不明です。複数の項を持つユニオン要素は、非空のメソッドセットを持つインターフェース型を含むことはできません。これが許可されるかどうかは現時点では不明です。
ジェネリクスはまた、Goエコシステムにとって大きな変化を表しています。いくつかのコアツールをジェネリクスサポートで更新しましたが、まだやるべきことがたくさんあります。これらの言語変更に追いつくために、残りのツール、ドキュメント、およびライブラリには時間がかかります。
バグ修正
Go 1.18コンパイラは、関数リテラル内で設定されているが使用されていない変数に対して、宣言されているが使用されていないエラーを正しく報告するようになりました。Go 1.18以前では、コンパイラはそのような場合にエラーを報告しませんでした。これにより、長年のコンパイラの問題#8560
が修正されました。この変更の結果として、(おそらく不正確な)プログラムはコンパイルされなくなる可能性があります。必要な修正は簡単です:プログラムが実際に不正確であった場合は修正するか、問題のある変数を使用します。たとえば、ブランク識別子_に代入します。go vetは常にこのエラーを指摘していたため、影響を受けるプログラムの数は非常に少ないと考えられます。
Go 1.18コンパイラは、printおよびprintlnの事前宣言された関数に引数としてルーン定数式(例:'1' << 32)を渡すときにオーバーフローを報告するようになりました。これは、ユーザー定義関数の動作と一致しています。Go 1.18以前では、コンパイラはそのような場合にエラーを報告せず、int64に収まる場合はそのような定数引数を黙って受け入れていました。この変更の結果として、(おそらく不正確な)プログラムはコンパイルされなくなる可能性があります。必要な修正は簡単です:プログラムが実際に不正確であった場合は修正するか、問題のある引数を正しい型に明示的に変換します。go vetは常にこのエラーを指摘していたため、影響を受けるプログラムの数は非常に少ないと考えられます。
ポート
AMD64
Go 1.18は、新しいGOAMD64環境変数を導入し、コンパイル時にAMD64アーキテクチャの最小ターゲットバージョンを選択します。許可される値はv1、v2、v3、またはv4です。各上位レベルは、追加のプロセッサ機能を必要とし、活用します。詳細な説明はこちら
で見つけることができます。GOAMD64環境変数のデフォルトはv1です。
RISC-V
Linux上の64ビットRISC-Vアーキテクチャ(linux/riscv64ポート)は、c-archiveおよびc-sharedビルドモードをサポートするようになりました。
Linux
Go 1.18はLinuxカーネルバージョン2.6.32以降を必要とします。
Windows
windows/armおよびwindows/arm64ポートは、非協力的プリエンプションをサポートするようになり、これにより、長時間ブロックするWin32関数を呼び出す際に遭遇する微妙なバグに対処できるはずです。
iOS
iOS(ios/arm64ポート)およびAMD64ベースのmacOSで実行されているiOSシミュレータ(ios/amd64ポート)では、Go 1.18はiOS 12以降を必要とするようになりました。以前のバージョンのサポートは終了しました。
FreeBSD
Go 1.18は、FreeBSD 11.xでサポートされる最後のリリースです。FreeBSD 11.xはすでにサポート終了しています。Go 1.19はFreeBSD 12.2+またはFreeBSD 13.0+を必要とします。FreeBSD 13.0+は、COMPAT_FREEBSD12オプションが設定されたカーネルを必要とします(これはデフォルトです)。
ツール
ファジング
Go 1.18には、ファジング提案
で説明されているファジングの実装が含まれています。開始するには、ファジングランディングページ
を参照してください。ファジングは大量のメモリを消費し、実行中にマシンのパフォーマンスに影響を与える可能性があることに注意してください。また、ファジングエンジンは、テストカバレッジを拡張する値を$GOCACHE/fuzz内のファズキャッシュディレクトリに書き込みます。ファズキャッシュに書き込まれるファイルの数や合計バイト数に制限は現在ないため、大量のストレージ(場合によっては数GB)を占有する可能性があります。
Goコマンド
go get
go getは、モジュール対応モードでパッケージをビルドまたはインストールしなくなりました。go getは、go.mod内の依存関係を調整することに専念しています。実質的に、-dフラグは常に有効です。現在のモジュールのコンテキスト外で実行可能ファイルの最新バージョンをインストールするには、goinstallexample.com/cmd@latest
を使用します。latestの代わりに任意のバージョンクエリ
を使用できます。この形式のgo installはGo 1.16で追加されたため、古いバージョンをサポートするプロジェクトは、go installとgo getの両方のインストール手順を提供する必要があるかもしれません。go getは、モジュール外で使用されるとエラーを報告するようになりました。更新するgo.modファイルがないためです。GOPATHモード(GO111MODULE=off)では、go getは以前と同様にパッケージをビルドおよびインストールします。
自動 go.mod および go.sum 更新
go mod graph、go mod vendor、go mod verify、およびgo mod whyサブコマンドは、go.modおよびgo.sumファイルを自動的に更新しなくなりました。(これらのファイルは、go get、go mod tidy、またはgo mod downloadを使用して明示的に更新できます。)
go version
goコマンドは、バイナリにバージョン管理情報を埋め込むようになりました。これには、現在チェックアウトされているリビジョン、コミット時間、および編集済みまたは追跡されていないファイルが存在するかどうかを示すフラグが含まれます。バージョン管理情報は、goコマンドがGit、Mercurial、Fossil、またはBazaarリポジトリ内のディレクトリで呼び出され、メインパッケージとその含まれるメインモジュールが同じリポジトリ内にある場合に埋め込まれます。この情報は、-buildvcs=falseフラグを使用して省略することができます。
さらに、goコマンドは、ビルドに関する情報を埋め込みます。これには、ビルドおよびツールタグ(-tagsで設定)、コンパイラ、アセンブラ、およびリンカーフラグ(-gcflagsなど)、cgoが有効かどうか、および有効な場合はcgo環境変数の値(CGO_CFLAGSなど)が含まれます。
VCSおよびビルド情報は、モジュール情報と一緒にgo version -m fileまたはruntime/debug.ReadBuildInfo(現在実行中のバイナリの場合)または新しいdebug/buildinfoパッケージを使用して読み取ることができます。
埋め込まれたビルド情報の基礎データ形式は、新しいgoリリースで変更される可能性があるため、古いバージョンのgoは新しいバージョンのgoで生成されたビルド情報を処理できない場合があります。go 1.18でビルドされたバイナリからバージョン情報を読み取るには、go versionコマンドとgo 1.18+のdebug/buildinfoパッケージを使用します。
go mod download
メインモジュールのgo.modファイルがgo1.17
以降を指定している場合、引数なしのgo mod downloadは、メインモジュールのgo.modファイルで明示的に要求
されているモジュールのソースコードのみをダウンロードします。(go 1.17以降のモジュールでは、そのセットにはすでにメインモジュール内のパッケージとテストをビルドするために必要なすべての依存関係が含まれています。)推移的依存関係のソースコードもダウンロードするには、go mod download allを使用します。
go mod vendor
go mod vendorサブコマンドは、出力ディレクトリを設定するための-oフラグをサポートするようになりました。(他のgoコマンドは、-mod=vendorでパッケージを読み込むときにモジュールルートのvendorディレクトリから読み取るため、このフラグの主な用途は、パッケージソースコードを収集する必要があるサードパーティツールです。)
go mod tidy
go mod tidyコマンドは、ビルドリスト内の各インポートされたパッケージが1つのモジュールによってのみ提供されることを確認するために必要なモジュールのソースコードの追加チェックサムをgo.sumファイルに保持するようになりました。この条件はまれであり、それを適用しないとビルドエラーが発生するため、この変更はメインモジュールのgo.modファイルのgoバージョンに依存しません。
go work
goコマンドは、「ワークスペース」モードをサポートするようになりました。作業ディレクトリまたは親ディレクトリにgo.workファイルが見つかるか、GOWORK環境変数を使用して指定されると、goコマンドはワークスペースモードに入ります。ワークスペースモードでは、通常見つかるgo.modファイルを使用して単一のメインモジュールを指定する代わりに、モジュール解決のルートとして使用されるメインモジュールのセットを決定するためにgo.workファイルが使用されます。詳細については、go work
ドキュメントを参照してください。
go build -asan
go buildコマンドおよび関連コマンドは、アドレスサニタイザ(Cコンパイラオプション-fsanitize=address)でコンパイルされたC(またはC++)コードとの相互運用を可能にする-asanフラグをサポートするようになりました。
go test
goコマンドは、上記で説明した新しいファジングサポートのための追加のコマンドラインオプションをサポートするようになりました:
go testは、-fuzz、-fuzztime、および-fuzzminimizetimeオプションをサポートします。これらのドキュメントについては、go help testflag を参照してください。go cleanは、-fuzzcacheオプションをサポートします。ドキュメントについては、go help clean を参照してください。
//go:build行
Go 1.17は、// +build行の代わりにビルド制約を記述するより読みやすい方法として//go:build行を導入しました。Go 1.17以降、gofmtは既存の+build行に一致する//go:build行を追加し、それらを同期させ、go vetはそれらが同期していない場合に診断します。Go 1.18のリリースはGo 1.16のサポートの終了を示すため、サポートされているすべてのGoバージョンは//go:build行を理解します。Go 1.18では、go fixは、go.modファイルでgo 1.18以降を宣言しているモジュールの古くなった// +build行を削除します。詳細については、go.dev/design/draft-gobuild
を参照してください。
go fmt
gofmtは、入力ファイルを並行して読み取り、フォーマットするようになり、GOMAXPROCSに比例したメモリ制限があります。複数のCPUを持つマシンでは、gofmtは今後大幅に高速になるはずです。
Vet
ジェネリクスの更新
vetツールは、ジェネリックコードをサポートするように更新されました。ほとんどの場合、vetは、型パラメータをその型セットからの型に置き換えた後、同等の非ジェネリックコードでエラーを報告する場合に、ジェネリックコードでエラーを報告します。たとえば、vetは次のようなフォーマットエラーを報告します:
| |
これは、Print[string]の非ジェネリックな同等のコードでフォーマットエラーを報告するためです:
| |
既存のチェッカーの精度向上
cmd/vetチェッカーcopylock、printf、sortslice、testinggoroutine、およびtestsは、追加のコードパターンを処理するために中程度の精度向上を受けました。これにより、既存のパッケージで新たに報告されるエラーが発生する可能性があります。たとえば、printfチェッカーは、文字列定数を連結して作成されたフォーマット文字列を追跡するようになりました。そのため、vetは次のようなエラーを報告します:
| |
ランタイム
ガベージコレクタは、スタックスキャンなどの非ヒープソースのガベージコレクタ作業を含めるようになり、実行頻度を決定します。その結果、これらのソースが重要な場合、ガベージコレクタのオーバーヘッドはより予測可能になります。ほとんどのアプリケーションでは、これらの変更は無視できる程度ですが、一部のGoアプリケーションは、以前よりも少ないメモリを使用し、ガベージコレクションに多くの時間を費やすか、またはその逆になる可能性があります。必要に応じてGOGCを調整することが意図された回避策です。
ランタイムは、オペレーティングシステムにメモリをより効率的に返すようになり、その結果、より積極的に動作するように調整されています。
Go 1.17は、スタックトレースの引数のフォーマットを一般的に改善しましたが、レジスタで渡された引数の不正確な値を印刷する可能性がありました。Go 1.18では、正確でない可能性のある値の後に疑問符(?)を印刷することで改善されています。
組み込み関数appendは、新しい基礎配列を割り当てる必要がある場合にスライスをどの程度成長させるかを決定する際に、わずかに異なる公式を使用するようになりました。新しい公式は、突然の割り当て動作の移行を起こしにくくなっています。
コンパイラ
Go 1.17は、選択されたオペレーティングシステム上の64ビットx86アーキテクチャで、スタックの代わりにレジスタを使用して関数の引数と結果を渡す新しい方法を実装しました
。Go 1.18は、サポートされるプラットフォームを64ビットARM(GOARCH=arm64)、ビッグエンディアンおよびリトルエンディアンの64ビットPowerPC(GOARCH=ppc64、ppc64le)、およびすべてのオペレーティングシステム上の64ビットx86アーキテクチャ(GOARCH=amd64)に拡張します。64ビットARMおよび64ビットPowerPCシステムでは、ベンチマークは通常10%以上のパフォーマンス向上を示しています。
Go 1.17のリリースノートで言及されているように 、この変更は安全なGoコードの機能に影響を与えず、ほとんどのアセンブリコードに影響を与えないように設計されています。詳細については、Go 1.17のリリースノート を参照してください。
コンパイラは、範囲ループまたはラベル付きforループを含む関数をインライン化できるようになりました。
新しい-asanコンパイラオプションは、新しいgoコマンド-asanオプションをサポートします。
コンパイラの型チェッカーは、ジェネリクスをサポートするために完全に置き換えられたため、一部のエラーメッセージは以前とは異なる表現を使用する場合があります。場合によっては、Go 1.18以前のエラーメッセージがより詳細であったり、より役立つ方法で表現されていたりしました。これらのケースに対処する予定です。
ジェネリクスをサポートするためのコンパイラの変更により、Go 1.18のコンパイル速度はGo 1.17のコンパイル速度よりも約15%遅くなる可能性があります。コンパイルされたコードの実行時間には影響しません。将来のリリースでコンパイラの速度を改善する予定です。
リンカー
リンカーははるかに少ないリロケーション
を出力します。その結果、ほとんどのコードベースはリンクが速くなり、リンクに必要なメモリが少なくなり、生成されるバイナリが小さくなります。Goバイナリを処理するツールは、Go 1.18のdebug/gosymパッケージを使用して、古いバイナリと新しいバイナリの両方を透過的に処理する必要があります。
新しい-asanリンカーオプションは、新しいgoコマンド-asanオプションをサポートします。
ブートストラップ
ソースからGoリリースをビルドする際にGOROOT_BOOTSTRAPが設定されていない場合、以前のバージョンのGoは、ディレクトリ$HOME/go1.4(Windowsでは%HOMEDRIVE%%HOMEPATH%\go1.4)にGo 1.4以降のブートストラップツールチェーンを探していました。Goは、$HOME/go1.17または$HOME/sdk/go1.17を最初に探し、次に$HOME/go1.4を探すようになりました。Go 1.19では、Go 1.17以降をブートストラップに必要とする予定であり、この変更により移行がスムーズになるはずです。詳細については、go.dev/issue/44505
を参照してください。
標準ライブラリ
新しい debug/buildinfo パッケージ
新しいdebug/buildinfo
パッケージは、goコマンドでビルドされた実行可能ファイルに埋め込まれたモジュールバージョン、バージョン管理情報、およびビルドフラグへのアクセスを提供します。同じ情報は、現在実行中のバイナリに対してはruntime/debug.ReadBuildInfo
を介して、コマンドラインではgo version -mを介しても利用できます。
新しい net/netip パッケージ
新しいnet/netip
パッケージは、新しいIPアドレスタイプAddr
を定義します。既存のnet.IP
型と比較して、netip.Addr型はメモリを少なく使用し、不変であり、比較可能であるため、==をサポートし、マップキーとして使用できます。Addrに加えて、パッケージはIPとポートを表すAddrPort
と、ネットワークCIDRプレフィックスを表すPrefix
を定義します。パッケージはまた、これらの新しい型を作成および調べるためのいくつかの関数を定義しています:AddrFrom4
、AddrFrom16
、AddrFromSlice
、AddrPortFrom
、IPv4Unspecified
、IPv6LinkLocalAllNodes
、IPv6Unspecified
、MustParseAddr
、MustParseAddrPort
、MustParsePrefix
、ParseAddr
、ParseAddrPort
、ParsePrefix
、PrefixFrom
。
net
パッケージには、既存のメソッドに並行する新しいメソッドが含まれており、より重いnet.IP
または*net.UDPAddr
型の代わりにnetip.AddrPortを返します:Resolver.LookupNetIP
、UDPConn.ReadFromUDPAddrPort
、UDPConn.ReadMsgUDPAddrPort
、UDPConn.WriteToUDPAddrPort
、UDPConn.WriteMsgUDPAddrPort
。新しいUDPConnメソッドは、割り当てのないI/Oをサポートします。
netパッケージには、既存のTCPAddr
/UDPAddr
型とnetip.AddrPortの間で変換するための関数とメソッドも含まれています:TCPAddrFromAddrPort
、UDPAddrFromAddrPort
、TCPAddr.AddrPort
、UDPAddr.AddrPort
。
クライアント側でデフォルトで無効化されたTLS 1.0および1.1
Config.MinVersion
が設定されていない場合、クライアント接続のデフォルトはTLS 1.2になります。安全に最新のサーバーはTLS 1.2をサポートすることが期待されており、ブラウザは2020年以降それを要求しています。TLS 1.0および1.1は、Config.MinVersionをVersionTLS10に設定することでまだサポートされています。サーバー側のデフォルトはTLS 1.0のままです。デフォルトは、GODEBUG=tls10default=1環境変数を設定することで一時的にTLS 1.0に戻すことができます。このオプションはGo 1.19で削除されます。
SHA-1証明書の拒否
crypto/x509は、SHA-1ハッシュ関数で署名された証明書を拒否するようになりました。これは自己署名されたルート証明書には適用されません。SHA-1に対する実際の攻撃は2017年以降実証されており
、公的に信頼された証明機関は2015年以降SHA-1証明書を発行していません。これは、GODEBUG=x509sha1=1環境変数を設定することで一時的に元に戻すことができます。このオプションは将来のリリースで削除されます。
ライブラリの小さな変更
いつものように、Go 1の互換性の約束 を念頭に置いて、ライブラリにさまざまな小さな変更と更新が行われています。
bufio
新しいWriter.AvailableBuffer
メソッドは、appendのようなAPIで使用するための空のバッファを返します。追加後、バッファを次のWrite呼び出しに提供し、コピーを回避する可能性があります。Reader.Reset
およびWriter.Reset
メソッドは、nilバッファを持つオブジェクトに対して呼び出された場合、デフォルトのバッファサイズを使用するようになりました。
bytes
新しいCut
関数は、セパレータの周りで[]byteをスライスします。これは、Index
、IndexByte
、IndexRune
、およびSplitN
の多くの一般的な使用を置き換え、簡素化できます。Trim
、TrimLeft
、およびTrimRight
は、割り当てが不要になり、特に小さなASCIIカットセットの場合、最大10倍高速になりました。Title
関数は非推奨になりました。これは、Unicodeの句読点や言語固有の大文字化ルールを処理せず、golang.org/x/text/cases
パッケージによって置き換えられています。
crypto/elliptic
P224
、P384
、およびP521
曲線の実装は、addchain
およびfiat-crypto
プロジェクトによって生成されたコードによってバックアップされるようになりました。後者は算術操作の形式的に検証されたモデルに基づいています。これらは、より安全な完全な公式と内部APIを使用するようになりました。P-224およびP-384は、現在約4倍高速です。すべての特定の曲線実装は、現在定数時間です。無効な曲線ポイント(IsOnCurveメソッドがfalseを返し、有効なポイントで動作するUnmarshalまたはCurveメソッドによって返されることはないもの)で操作することは常に未定義の動作であり、キー回復攻撃につながる可能性があり、新しいバックエンドではサポートされていません。無効なポイントがP224、P384、またはP521メソッドに提供された場合、そのメソッドは現在ランダムなポイントを返します。この動作は将来のリリースで明示的なパニックに変更される可能性があります。
crypto/tls
新しいConn.NetConn メソッドは、基礎となるnet.Conn へのアクセスを許可します。
crypto/x509
Certificate.Verify
は、nilのVerifyOpts.Roots
で呼び出された場合、またはSystemCertPool
から返されたルートプールを使用している場合、macOSおよびiOSで証明書の有効性を検証するためにプラットフォームAPIを使用するようになりました。SystemCertPool
は、Windowsで利用可能になりました。Windows、macOS、およびiOSでは、SystemCertPool
から返されたCertPool
に追加の証明書が追加された場合、Certificate.Verify
は、プラットフォームの検証APIとシステムルートを使用した検証と、Goの検証と追加のルートを使用した検証の2つを行います。プラットフォームの検証APIによって返されたチェーンが優先されます。CertPool.Subjects
は非推奨です。Windows、macOS、およびiOSでは、SystemCertPool
から返されたCertPool
は、Subjectsによって返されるスライスにシステムルートを含まないプールを返します。静的リストはプラットフォームポリシーを適切に表現できず、プラットフォームAPIからまったく利用できない可能性があります。MD5ハッシュ(MD5WithRSA)に依存する署名アルゴリズムを使用して証明書に署名するサポートは、Go 1.19で削除される可能性があります。
debug/dwarf
StructField
およびBasicType
構造体には、DW_AT_data_bit_offset属性の値を保持するDataBitOffsetフィールドが追加されました。
debug/elf
R_PPC64_RELATIVE 定数が追加されました。
debug/plan9obj
File.Symbols メソッドは、ファイルにシンボルセクションがない場合に新しいエクスポートされたエラー値ErrNoSymbols を返すようになりました。
embed
go:embed
ディレクティブは、ドットまたはアンダースコアで始まるファイルを含めるためにall:で始めることができるようになりました。
go/ast
提案パラメータ化された関数と型をサポートするためのgo/astとgo/tokenへの追加 に従って、go/ast パッケージに次の追加が行われました:
- FuncType
およびTypeSpec
ノードには、型パラメータを保持する新しいフィールド
TypeParamsが追加されました。 - 新しい式ノードIndexListExpr は、複数のインデックスを持つインデックス式を表し、複数の明示的な型引数を持つ関数と型のインスタンス化に使用されます。
go/constant
新しいKind.String メソッドは、受信者の種類の人間が読める名前を返します。
go/token
新しい定数TILDE
は、提案パラメータ化された関数と型をサポートするためのgo/astとgo/tokenへの追加
に従って、~トークンを表します。
go/types
新しいConfig.GoVersion フィールドは、受け入れられるGo言語バージョンを設定します。提案型パラメータをサポートするためのgo/typesへの追加 に従って、go/types パッケージに次の追加が行われました:
- 新しい型TypeParam 、ファクトリ関数NewTypeParam 、および関連するメソッドが追加され、型パラメータを表します。
- 新しい型TypeParamList は、型パラメータのリストを保持します。
- 新しい型TypeList は、型のリストを保持します。
- 新しいファクトリ関数NewSignatureType
は、(レシーバーまたは関数の)型パラメータを持つSignature
を割り当てます。それらの型パラメータにアクセスするために、
Signature型には2つの新しいメソッドSignature.RecvTypeParams およびSignature.TypeParams があります。 - Named 型には4つの新しいメソッドがあります:インスタンス化された型の元のパラメータ化された型を取得するためのNamed.Origin 、インスタンス化された型またはパラメータ化された型の型引数または型パラメータを取得するためのNamed.TypeArgs およびNamed.TypeParams 、および型パラメータを設定するためのNamed.SetTypeParams (たとえば、名前付き型の割り当てと型パラメータの設定を同時に行うことができない可能性のあるサイクルのために、名前付き型をインポートする場合)。
- Interface 型には4つの新しいメソッドがあります:インターフェースによって定義された型セットのプロパティを照会するためのInterface.IsComparable およびInterface.IsMethodSet 、およびインターフェースが型制約リテラルの周りの暗黙のインターフェースであるかどうかを設定およびテストするためのInterface.MarkImplicit およびInterface.IsImplicit 。
- 新しい型Union およびTerm 、ファクトリ関数NewUnion およびNewTerm 、および関連するメソッドが追加され、インターフェース内の型セットを表します。
- 新しい関数Instantiate は、パラメータ化された型をインスタンス化します。
- 新しいInfo.Instances マップは、新しいInstance 型を通じて関数と型のインスタンス化を記録します。
新しい型ArgumentError および関連するメソッドが追加され、型引数に関連するエラーを表します。
新しい型Context およびファクトリ関数NewContext が追加され、型チェックされたパッケージ間で同一の型インスタンスを共有することを容易にします。新しいConfig.Context フィールドを介して。
述語AssignableTo
、ConvertibleTo
、Implements
、Identical
、IdenticalIgnoreTags
、およびAssertableTo
は、一般化されたインターフェースを含む引数でも動作します。すなわち、Goコードで型制約としてのみ使用できるインターフェースです。AssignableTo、ConvertibleTo、Implements、およびAssertableToの動作は、インスタンス化されていないジェネリック型の引数に対して未定義であり、AssertableToは、最初の引数が一般化されたインターフェースである場合に未定義です。
html/template
範囲パイプライン内で、新しい{{break}}コマンドはループを早期に終了し、新しい{{continue}}コマンドは次のループ反復を直ちに開始します。and関数はもはや常にすべての引数を評価するわけではなく、falseと評価される最初の引数の後に引数の評価を停止します。同様に、or関数は、trueと評価される最初の引数の後に引数の評価を停止します。これは、引数のいずれかが関数呼び出しである場合に違いを生じます。
image/draw
DrawおよびDrawMaskのフォールバック実装(引数が最も一般的な画像タイプでない場合に使用される)は、これらの引数がGo 1.17で追加されたオプションのdraw.RGBA64Image
およびimage.RGBA64Image
インターフェースを実装している場合に、より高速になりました。
net
net.Error.Temporary は非推奨になりました。
net/http
WebAssemblyターゲットでは、TransportのDial、DialContext、DialTLS、およびDialTLSContextメソッドフィールドは、指定されている場合、HTTPリクエストを行うために正しく使用されるようになりました。新しいCookie.Valid
メソッドは、クッキーが有効かどうかを報告します。新しいMaxBytesHandler
関数は、ResponseWriterおよびRequest.BodyをMaxBytesReader
でラップするハンドラを作成します。非ASCII文字を含むドメイン名を検索する際、Unicode-to-ASCII変換は、Unicode IDNA Compatibility Processing
標準(UTS #46)で定義されている非遷移処理に従って行われるようになりました。4つの異なるルーンの解釈が変更されました:ß、ς、ゼロ幅結合子U+200D、およびゼロ幅非結合子U+200C。非遷移処理は、ほとんどのアプリケーションおよびWebブラウザと一致しています。
os/user
User.GroupIds
は、cgoが利用できない場合にGoネイティブの実装を使用するようになりました。
reflect
新しいValue.SetIterKey
およびValue.SetIterValue
メソッドは、マップイテレータをソースとして使用してValueを設定します。これらは、Value.Set(iter.Key())およびValue.Set(iter.Value())と同等ですが、割り当てが少なくなります。新しいValue.UnsafePointer
メソッドは、Valueの値をunsafe.Pointer
として返します。これにより、呼び出し元はValue.UnsafeAddr
およびValue.Pointer
から移行し、呼び出しサイトでのuintptrからunsafe.Pointerへの変換を不要にすることができます(unsafe.Pointerルールが要求するように)。新しいMapIter.Reset
メソッドは、そのレシーバーを異なるマップを反復するように変更します。MapIter.Reset
の使用により、多くのマップに対する割り当てのない反復が可能になります。いくつかのメソッド(Value.CanInt
、Value.CanUint
、Value.CanFloat
、Value.CanComplex
)がValue
に追加され、変換が安全かどうかをテストします。Value.FieldByIndexErr
が追加され、埋め込み構造体へのnilポインタをステップスルーする際にValue.FieldByIndex
で発生するパニックを回避します。reflect.Ptr
およびreflect.PtrTo
は、それぞれreflect.Pointer
およびreflect.PointerTo
に名前が変更され、reflectパッケージの残りと一貫性があります。古い名前は引き続き機能しますが、将来のGoリリースで非推奨になります。
regexp
regexp
は、UTF-8文字列の各無効なバイトをU+FFFDとして扱うようになりました。
runtime/debug
BuildInfo 構造体には、バイナリがどのようにビルドされたかに関する追加情報を含む2つの新しいフィールドがあります:
- GoVersion は、バイナリをビルドするために使用されたGoのバージョンを保持します。
- Settings は、ビルドを説明するキー/値ペアを保持するBuildSettings 構造体のスライスです。
runtime/pprof
CPUプロファイラは、Linuxでスレッドごとのタイマーを使用するようになりました。これにより、プロファイルが観察できる最大CPU使用率が増加し、バイアスの一部が減少します。
strconv
strconv.Unquote は、Unicodeサロゲートハーフを拒否するようになりました。
strings
新しいCut 関数は、セパレータの周りで文字列をスライスします。これは、Index 、IndexByte 、IndexRune 、およびSplitN の多くの一般的な使用を置き換え、簡素化できます。新しいClone 関数は、返されたクローン文字列が入力文字列のメモリを参照せずに入力文字列をコピーします。Trim 、TrimLeft 、およびTrimRight は、割り当てが不要になり、特に小さなASCIIカットセットの場合、最大10倍高速になりました。Title 関数は非推奨になりました。これは、Unicodeの句読点や言語固有の大文字化ルールを処理せず、golang.org/x/text/cases パッケージによって置き換えられています。
sync
新しいメソッドMutex.TryLock 、RWMutex.TryLock 、およびRWMutex.TryRLock は、ロックが現在保持されていない場合にロックを取得します。
syscall
新しい関数SyscallN がWindows用に導入され、任意の数の引数を持つ呼び出しを可能にします。その結果、Syscall 、Syscall6 、Syscall9 、Syscall12 、Syscall15 、およびSyscall18 はSyscallN に置き換えられ、非推奨になりました。SysProcAttr.Pdeathsig はFreeBSDでサポートされるようになりました。
syscall/js
Wrapperインターフェースは削除されました。
testing
-runおよび-benchの引数の/の優先順位が上がりました。A/B|C/Dは以前はA/(B|C)/Dとして扱われていましたが、現在は(A/B)|(C/D)として扱われます。-runオプションがテストを選択しない場合、-countオプションは無視されます。これは、テスト関数自体が実行されるたびに実行されるサブテストのセットを変更するテストがある場合、既存のテストの動作を変更する可能性があります。新しいtesting.F
型は、上記で説明した新しいファジングサポートによって使用されます。テストはまた、コマンドラインオプション-test.fuzz、-test.fuzztime、および-test.fuzzminimizetimeをサポートするようになりました。
text/template
範囲パイプライン内で、新しい{{break}}コマンドはループを早期に終了し、新しい{{continue}}コマンドは次のループ反復を直ちに開始します。and関数はもはや常にすべての引数を評価するわけではなく、falseと評価される最初の引数の後に引数の評価を停止します。同様に、or関数は、trueと評価される最初の引数の後に引数の評価を停止します。これは、引数のいずれかが関数呼び出しである場合に違いを生じます。
text/template/parse
パッケージは、新しい定数NodeBreak
と新しい型BreakNode
を介して、新しいtext/template
およびhtml/template
の{{break}}コマンドをサポートし、同様に新しい定数NodeContinue
と新しい型ContinueNode
を介して新しい{{continue}}コマンドをサポートします。
unicode/utf8
新しいAppendRune
関数は、ルーンのUTF-8エンコーディングを[]byteに追加します。