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

JavaScriptを有効にしてください

前書き

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

次のバージョン:Go1.18のリリースノート(日本語訳)
前のバージョン:Go1.16のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報

Go 1.17の紹介

最新のGoリリースであるバージョン1.17は、Go 1.16 の6か月後に登場しました。変更のほとんどはツールチェーン、ランタイム、ライブラリの実装にあります。リリースは常にGo 1の互換性の約束 を維持しています。ほとんどのGoプログラムは、以前と同様にコンパイルおよび実行されることを期待しています。

言語の変更

Go 1.17には、言語に対する3つの小さな拡張が含まれています。

スライスから配列ポインタへの変換 : 型[]Tの式sは、配列ポインタ型*[N]Tに変換できるようになりました。この変換の結果がaである場合、範囲内の対応するインデックスは同じ基礎要素を参照します: &a[i] == &s[i]0 <= i < Nlen(s)N未満の場合、変換はパニックを引き起こします。

unsafe.Add : unsafe.Add(ptr, len)lenptrに加算し、更新されたポインタunsafe.Pointer(uintptr(ptr) + uintptr(len))を返します。

unsafe.Slice : 型*Tの式ptrに対して、unsafe.Slice(ptr, len)は基礎配列がptrから始まり、長さと容量がlenであるスライス型[]Tを返します。

パッケージunsafeの拡張は、unsafe.Pointer安全性ルール に準拠したコードを書くことを簡素化するために追加されましたが、ルール自体は変更されていません。特に、unsafe.Pointerを正しく使用する既存のプログラムは有効なままであり、新しいプログラムもunsafe.Addunsafe.Sliceを使用する際にはルールに従う必要があります。スライスから配列ポインタへの新しい変換は、型変換が実行時にパニックを引き起こす可能性がある最初のケースであることに注意してください。型変換が決してパニックを引き起こさないと仮定する分析ツールは、この可能性を考慮するように更新する必要があります。

ポート

Darwin

Go 1.16のリリースノート で発表されたように、Go 1.17はmacOS 10.13 High Sierra以降を必要とし、以前のバージョンのサポートは終了しました。

Windows

Go 1.17はWindowsでの64ビットARMアーキテクチャ(windows/arm64ポート)のサポートを追加しました。このポートはcgoをサポートしています。

OpenBSD

OpenBSDの64ビットMIPSアーキテクチャ(openbsd/mips64ポート)は、cgoをサポートするようになりました。Go 1.16では、OpenBSDの64ビットx86および64ビットARMアーキテクチャ(openbsd/amd64およびopenbsd/arm64ポート)でシステムコールはマシン命令を直接使用するのではなく、libcを通じて行われていました。Go 1.17では、これがOpenBSDの32ビットx86および32ビットARMアーキテクチャ(openbsd/386およびopenbsd/armポート)でも行われます。これは、非静的なGoバイナリに対してlibcを通じてシステムコールを行うことを要求するOpenBSD 6.9以降との互換性を確保します。

ARM64

Goプログラムは、すべてのオペレーティングシステムで64ビットARMアーキテクチャ上でスタックフレームポインタを維持するようになりました。以前は、スタックフレームポインタはLinux、macOS、およびiOSでのみ有効でした。

loong64 GOARCH値の予約

メインのGoコンパイラはまだLoongArchアーキテクチャをサポートしていませんが、GOARCH値「loong64」を予約しました。これにより、*_loong64.goという名前のGoファイルは、そのGOARCH値が使用されている場合を除き、Goツールによって無視される ようになります。

ツール

Go コマンド

Go 1.17モジュールでのモジュールグラフの剪定

モジュールがgo 1.17以上を指定している場合、モジュールグラフには他のgo 1.17モジュールの直接の依存関係のみが含まれ、その完全な推移的依存関係は含まれません。詳細についてはモジュールグラフの剪定 を参照してください。goコマンドが剪定されたモジュールグラフを使用して推移的インポートを正しく解決するためには、各モジュールのgo.modファイルに、そのモジュールに関連する推移的依存関係の詳細を含める必要があります。モジュールがgo 1.17以上をgo.modファイルで指定している場合、そのgo.modファイルには、推移的にインポートされたパッケージを提供するすべてのモジュールに対する明示的なrequireディレクティブ が含まれるようになりました。(以前のバージョンでは、go.modファイルには通常、直接インポートされたパッケージに対する明示的な要件のみが含まれていました。)モジュールグラフの剪定に必要な拡張されたgo.modファイルには、メインモジュール内の任意のパッケージのインポートを読み込むために必要なすべての依存関係が含まれているため、メインモジュールがgo 1.17以上を指定している場合、goツールは要求されたコマンドを完了するために必要でない限り、依存関係のgo.modファイルを読み取ったり(またはダウンロードしたり)しなくなります。(Lazy loading を参照してください。)拡張されたGo 1.17のgo.modファイルで明示的な要件の数が大幅に増加する可能性があるため、go 1.17モジュールでの間接依存関係に対する新たに追加された要件は、直接依存関係を含むブロックとは別のrequireブロックで管理されます。Go 1.17の剪定されたモジュールグラフへのアップグレードを容易にするために、gomodtidy サブコマンドは、go.modファイルのGoバージョンを設定または変更するための-goフラグをサポートするようになりました。既存のモジュールのgo.modファイルをGo 1.17に変換し、依存関係の選択されたバージョンを変更せずに実行するには、次のコマンドを実行します:

bash
1
go mod tidy -go=1.17

デフォルトでは、go mod tidyは、メインモジュールに関連する依存関係の選択されたバージョンが以前のGoリリース(go 1.17を指定するモジュールの場合はGo 1.16)で使用されるバージョンと同じであることを検証し、他のコマンドで通常必要とされない依存関係であっても、そのリリースで必要なgo.sumエントリを保持します。-compatフラグを使用すると、そのバージョンを上書きして、go.modファイルのgoディレクティブで指定されたバージョンまでの古い(または新しい)バージョンをサポートできます。Go 1.17のみのためにgo 1.17モジュールを整理し、Go 1.16との整合性をチェックせずに(またはチェックサムを保存せずに)実行するには、次のコマンドを実行します:

bash
1
go mod tidy -compat=1.17

メインモジュールが-compat=1.17で整理されている場合でも、go 1.16またはそれ以前のモジュールからモジュールを必要とするユーザーは、パッケージが互換性のある言語およびライブラリ機能のみを使用している限り、それを使用できます。gomodgraph サブコマンドも-goフラグをサポートしており、指定されたGoバージョンによって見られるグラフを報告し、通常は剪定される依存関係を表示します。

モジュールの非推奨コメント

モジュールの作成者は、go.mod// Deprecated:コメント を追加し、新しいバージョンをタグ付けすることでモジュールを非推奨にすることができます。go getは、コマンドラインで名前が指定されたパッケージをビルドするために必要なモジュールが非推奨である場合、警告を表示します。go list -m -uは、すべての依存関係の非推奨を表示します(完全なメッセージを表示するには-fまたは-jsonを使用します)。goコマンドは、異なるメジャーバージョンを別個のモジュールと見なすため、このメカニズムを使用して、たとえば新しいメジャーバージョンへの移行手順をユーザーに提供することができます。

go get

go get -insecureフラグは非推奨となり、削除されました。依存関係を取得する際に安全でないスキームの使用を許可するには、GOINSECURE環境変数を使用してください。-insecureフラグはまた、モジュールのサム検証をバイパスしました。この機能が必要な場合は、GOPRIVATEまたはGONOSUMDBを使用してください。詳細については、go help environmentを参照してください。go getは、メインモジュール外でコマンドをインストールする際に非推奨の警告を表示します(-dフラグなしで)。特定のバージョンでコマンドをインストールするには、go install cmd@versionを使用し、@latest@v1.2.3のようなサフィックスを使用してください。Go 1.18では、-dフラグが常に有効になり、go getgo.modの依存関係を変更するためにのみ使用されます。

go.modファイルにgoディレクティブがない場合

メインモジュールのgo.modファイルにgoディレクティブ が含まれておらず、goコマンドがgo.modファイルを更新できない場合、goコマンドは現在のリリースではなくgo 1.11を仮定します。(go mod initGo 1.12以降 自動的にgoディレクティブを追加しています。)モジュール依存関係に明示的なgo.modファイルがない場合、またはそのgo.modファイルにgoディレクティブ が含まれていない場合、goコマンドはその依存関係に対して現在のリリースではなくgo 1.16を仮定します。(GOPATHモードで開発された依存関係にはgo.modファイルがない場合があり、vendor/modules.txtはこれまで依存関係のgo.modファイルで示されたgoバージョンを記録していませんでした。)

vendorの内容

メインモジュールがgo 1.17以上を指定している場合、gomodvendor は、各ベンダーモジュールのgo.modファイルで示されたgoバージョンをvendor/modules.txtに注釈を付けるようになりました。注釈付きバージョンは、ベンダーされたソースコードからモジュールのパッケージをビルドする際に使用されます。メインモジュールがgo 1.17以上を指定している場合、go mod vendorはベンダーされた依存関係のgo.modおよびgo.sumファイルを省略するようになりました。これにより、ベンダーツリー内でgoコマンドが正しいモジュールルートを識別する能力に干渉する可能性がある問題が解消されます。

パスワードプロンプト

goコマンドはデフォルトで、SSHを使用してGitリポジトリをフェッチする際にSSHパスワードプロンプトとGit Credential Managerプロンプトを抑制するようになりました。これは、以前に他のGitパスワードプロンプトで行われていたものと同様です。パスワードで保護されたSSHを使用してプライベートGitリポジトリに認証するユーザーは、ssh-agentを設定して、goコマンドがパスワードで保護されたSSHキーを使用できるようにすることができます。

go mod download

引数なしでgo mod downloadが呼び出された場合、ダウンロードされたモジュールコンテンツのサムをgo.sumに保存しなくなります。ビルドリストを読み込むために必要なgo.modおよびgo.sumの変更は引き続き行われる可能性があります。これはGo 1.15の動作と同じです。すべてのモジュールのサムを保存するには、go mod download allを使用してください。

//go:build行

goコマンドは//go:build行を理解し、// +build行よりも優先します。新しい構文はGoと同様にブール式を使用し、エラーが発生しにくくなっています。このリリースでは、新しい構文が完全にサポートされており、すべてのGoファイルは同じ意味を持つ両方の形式に更新されるべきです。移行を支援するために、go fmt は自動的に2つの形式を同期します。構文と移行計画の詳細については、https://golang.org/design/draft-gobuild を参照してください。

go run

go runはバージョンサフィックス付きの引数を受け入れるようになりました(例: go run example.com/cmd@v1.0.0)。これにより、go runはモジュール対応モードでパッケージをビルドおよび実行し、現在のディレクトリまたは親ディレクトリにgo.modファイルがある場合でもそれを無視します。これは、依存関係を変更せずに実行可能ファイルをインストールせずに実行するのに便利です。

go fmt

go fmt(およびgo fmt)は、//go:build行を// +build行と同期するようになりました。ファイルに// +build行のみがある場合、それらはファイル内の適切な場所に移動され、対応する//go:build行が追加されます。それ以外の場合、// +build行は既存の//go:build行に基づいて上書きされます。詳細については、https://golang.org/design/draft-gobuild を参照してください。

Vet

不一致の //go:build と // +build 行に対する新しい警告

vetツールは、//go:build// +build行がファイルの正しい部分にあり、互いに同期していることを確認するようになりました。そうでない場合、go fmt を使用して修正できます。詳細については、https://golang.org/design/draft-gobuild を参照してください。

バッファされていないチャネルでの signal.Notify 呼び出しに対する新しい警告

vetツールは、バッファされていないチャネルに送信される着信信号を持つsignal.Notify への呼び出しについて警告するようになりました。バッファされていないチャネルを使用すると、signal.Notifyがチャネルへの送信時にブロックしないため、信号が失われるリスクがあります。例えば:

go
1
2
3
4
c := make(chan os.Signal)
// チャネルから読み取る前に信号がcに送信されます。
// cがバッファされていないため、この信号は失われる可能性があります。
signal.Notify(c, os.Interrupt)

signal.Notifyのユーザーは、予想される信号レートに対応するために十分なバッファスペースを持つチャネルを使用する必要があります。

Is、As、Unwrap メソッドに対する新しい警告

vetツールは、エラーインターフェースを実装する型において、errorsパッケージで期待されるシグネチャとは異なるシグネチャを持つAsIsUnwrapという名前のメソッドについて警告するようになりました。errors.{As,Is,Unwrap}関数は、そのようなメソッドがIs(error) boolAs(interface{}) bool、またはUnwrap() errorのいずれかを実装することを期待しています。errors.{As,Is,Unwrap}関数は、同じ名前で異なるシグネチャを持つメソッドを無視します。例えば:

go
1
2
3
4
5
6
7
type MyError struct { hint string }
func (m MyError) Error() string { ... } // MyErrorはエラーを実装します。
func (MyError) Is(target interface{}) bool { ... } // targetはinterface{}であり、errorではありません。
func Foo() bool {
    x, y := MyError{"A"}, MyError{"B"}
    return errors.Is(x, y) // x != yであり、MyErrorには`Is(error) bool`関数がないため、falseを返します。
}

Cover

coverツールは、golang.org/x/tools/coverからの最適化されたパーサーを使用するようになり、大きなカバレッジプロファイルを解析する際に顕著に高速になる可能性があります。

コンパイラ

Go 1.17は、関数の引数と結果をスタックではなくレジスタを使用して渡す新しい方法を実装しています。代表的なGoパッケージとプログラムのベンチマークでは、約5%のパフォーマンス向上と、バイナリサイズの約2%の削減が示されています。これは現在、64ビットx86アーキテクチャ(linux/amd64darwin/amd64windows/amd64ポート)のLinux、macOS、およびWindowsで有効になっています。この変更は、安全なGoコードの機能には影響を与えず、ほとんどのアセンブリコードに影響を与えないように設計されています。関数引数にアクセスする際にunsafe.Pointerルールを違反するコードや、関数コードポインタの比較に関する未公開の動作に依存するコードに影響を与える可能性があります。既存のアセンブリ関数との互換性を維持するために、コンパイラは新しいレジスタベースの呼び出し規約と以前のスタックベースの呼び出し規約を変換するアダプタ関数を生成します。これらのアダプタは通常ユーザーには見えませんが、アセンブリコードでGo関数のアドレスを取得したり、Goコードでアセンブリ関数のアドレスをreflect.ValueOf(fn).Pointer()unsafe.Pointerを使用して取得する場合、アダプタのアドレスが返されるようになります。これらのコードポインタの値に依存するコードは、期待通りに動作しなくなる可能性があります。アダプタはまた、2つのケースで非常に小さなパフォーマンスオーバーヘッドを引き起こす可能性があります: Goからアセンブリを介して間接的にアセンブリ関数を呼び出す場合、およびアセンブリからGo関数を呼び出す場合です。ランタイムからのスタックトレースの形式(未キャッチのパニックが発生した場合やruntime.Stackが呼び出された場合に印刷される)は改善されました。以前は、関数引数はメモリレイアウトに基づいて16進数のワードとして印刷されていました。現在、ソースコード内の各引数はコンマで区切られて個別に印刷されます。集約型(構造体、配列、文字列、スライス、インターフェース、複素数)の引数は中括弧で区切られます。注意点として、レジスタ内にのみ存在しメモリに保存されていない引数の値は不正確である可能性があります。関数の戻り値(通常は不正確であった)はもはや印刷されません。クロージャを含む関数はインライン化できるようになりました。この変更の1つの効果は、クロージャを持つ関数がインライン化されるたびに異なるクロージャコードポインタを生成する可能性があることです。Go関数値は直接比較できませんが、この変更により、reflectunsafe.Pointerを使用してこの言語制限を回避し、コードポインタで関数を比較するコードのバグが明らかになる可能性があります。

リンカー

リンカーが外部リンクモードを使用する場合、これはcgoを使用するプログラムをリンクする際のデフォルトであり、リンカーが-Iオプションで呼び出された場合、そのオプションは外部リンカーに-Wl,--dynamic-linkerオプションとして渡されるようになりました。

標準ライブラリ

Cgo

runtime/cgo パッケージは、任意のGo値を安全に表現し、CとGoの間で値を安全に渡すための新しい機能を提供するようになりました。詳細については、runtime/cgo.Handle を参照してください。

URLクエリ解析

net/urlおよびnet/httpパッケージは、URLクエリでの設定セパレータとして";"(セミコロン)を"&"(アンパサンド)に加えて受け入れていました。現在、非パーセントエンコードされたセミコロンを含む設定は拒否され、net/httpサーバーはリクエストURLでそれに遭遇した場合にServer.ErrorLog に警告を記録します。例えば、Go 1.17以前では、URLexample?a=1;b=2&c=3Query メソッドはmap[a:[1] b:[2] c:[3]]を返していましたが、現在はmap[c:[3]]を返します。このようなクエリ文字列に遭遇した場合、URL.Query およびRequest.FormValue はセミコロンを含む設定を無視し、ParseQuery は残りの設定とエラーを返し、Request.ParseForm およびRequest.ParseMultipartForm はエラーを返しますが、残りの設定に基づいてリクエストフィールドを設定します。net/httpユーザーは、新しいAllowQuerySemicolons ハンドララッパーを使用して元の動作を復元できます。クエリセパレータとしてセミコロンを受け入れることは、異なるシステムがキャッシュキーを異なる方法で解釈する場合にセキュリティ問題を引き起こす可能性があることに注意してください。詳細については、issue 25192 を参照してください。

TLS厳格ALPN

Config.NextProtos が設定されている場合、サーバーは、設定されたプロトコルとクライアントが広告するALPNプロトコルの間に重複があることを強制するようになりました。互いにサポートされているプロトコルがない場合、接続はRFC 7301で要求されているようにno_application_protocolアラートで閉じられます。これはALPACAクロスプロトコル攻撃 を軽減するのに役立ちます。例外として、サーバーのConfig.NextProtosに値「h2」が含まれている場合、HTTP/1.1クライアントはALPNをサポートしていないかのように接続が許可されます。詳細については、issue 46310 を参照してください。

ライブラリの小さな変更

常に、Go 1の互換性の約束 を念頭に置いて、ライブラリにさまざまな小さな変更と更新が行われています。

archive/zip

新しいメソッドFile.OpenRawWriter.CreateRawWriter.Copy は、パフォーマンスが主要な関心事である場合のサポートを提供します。

bufio

Writer.WriteRune メソッドは、他の無効なルーンと同様に、負のルーン値に対して置換文字U+FFFDを書き込むようになりました。

bytes

Buffer.WriteRune メソッドは、他の無効なルーンと同様に、負のルーン値に対して置換文字U+FFFDを書き込むようになりました。

compress/lzw

NewReader 関数は、新しい型Reader の値を返すことが保証されており、同様にNewWriter も新しい型Writer の値を返すことが保証されています。これらの新しい型はどちらも、Reader.ResetWriter.Reset メソッドを実装しており、ReaderまたはWriterの再利用を可能にします。

crypto/ed25519

crypto/ed25519パッケージは書き直され、すべての操作がamd64およびarm64で約2倍高速になりました。観察可能な動作はそれ以外に変更されていません。

crypto/elliptic

CurveParams メソッドは、利用可能な場合に既知の曲線(P-224、P-256、P-521)のためのより高速で安全な専用実装を自動的に呼び出すようになりました。これはベストエフォートのアプローチであり、アプリケーションは一般的でない、定数時間でないCurveParamsメソッドの使用を避け、代わりにP256 などの専用Curve 実装を使用するべきです。P521 曲線の実装は、算術操作の形式的に検証されたモデルに基づくfiat-cryptoプロジェクト によって生成されたコードを使用して書き直されました。これは現在、定数時間であり、amd64およびarm64で3倍高速です。観察可能な動作はそれ以外に変更されていません。

crypto/rand

crypto/randパッケージは、macOSでgetentropyシステムコールを使用し、Solaris、Illumos、DragonFlyBSDでgetrandomシステムコールを使用するようになりました。

crypto/tls

新しいConn.HandshakeContext メソッドは、進行中のTLSハンドシェイクのキャンセルを制御するためにユーザーがコンテキストを提供できるようにします。提供されたコンテキストは、新しいClientHelloInfo.Context およびCertificateRequestInfo.Context メソッドを通じてさまざまなコールバックからアクセス可能です。ハンドシェイクが終了した後にコンテキストをキャンセルしても効果はありません。暗号スイートの順序付けは完全にcrypto/tlsパッケージによって処理されるようになりました。現在、暗号スイートはセキュリティ、パフォーマンス、ハードウェアサポートに基づいてソートされ、ローカルおよびピアのハードウェアの両方を考慮に入れています。Config.CipherSuites フィールドの順序は無視され、Config.PreferServerCipherSuites フィールドも無視されます。Config.CipherSuitesは依然としてアプリケーションがTLS 1.0–1.2の暗号スイートを選択することを許可します。3DES暗号スイートは、基本的なブロックサイズ関連の弱点 のためにInsecureCipherSuites に移動されました。これらは依然としてデフォルトで有効ですが、上記の暗号スイートの順序変更のおかげで最後の手段としてのみ使用されます。次のリリースであるGo 1.18から、crypto/tlsクライアントのConfig.MinVersion はデフォルトでTLS 1.2になり、TLS 1.0およびTLS 1.1がデフォルトで無効になります。アプリケーションは、Config.MinVersionを明示的に設定することで変更を上書きできます。これはcrypto/tlsサーバーには影響しません。

crypto/x509

CreateCertificate は、提供された秘密鍵が親の公開鍵と一致しない場合にエラーを返すようになりました。結果として得られる証明書は検証に失敗します。仮のGODEBUG=x509ignoreCN=0フラグは削除されました。ParseCertificate は書き直され、約70%少ないリソースを消費するようになりました。WebPKI証明書を処理する際の観察可能な動作はそれ以外に変更されていませんが、エラーメッセージは変更されています。BSDシステムでは、/etc/ssl/certsが信頼されたルートとして検索されるようになりました。これにより、FreeBSD 12.2+の新しいシステム信頼証明書ストアがサポートされます。次のリリースであるGo 1.18から、crypto/x509はSHA-1ハッシュ関数で署名された証明書を拒否します。これは自己署名されたルート証明書には適用されません。SHA-1に対する実用的な攻撃は2017年に実証されており 、公開信頼された証明書機関は2015年以降SHA-1証明書を発行していません。

database/sql

DB.Close メソッドは、フィールド内の型がio.Closer インターフェースを実装している場合、そのフィールドを閉じるようになりました。新しいNullInt16 およびNullByte 構造体は、nullである可能性のあるint16およびbyte値を表します。これらは、NullStringと同様にScan メソッドの宛先として使用できます。

debug/elf

SHT_MIPS_ABIFLAGS 定数が追加されました。

encoding/binary

binary.Uvarintは、無駄な計算を避けるために10バイト後に読み取りを停止します。10バイト以上が必要な場合、返されるバイト数は-11です。以前のGoバージョンでは、誤ってエンコードされたvarintを読み取る際に、より大きな負のカウントを返すことがありました。

encoding/csv

新しいReader.FieldPos メソッドは、Read によって最近返されたレコード内の特定のフィールドの開始に対応する行と列を返します。

encoding/xml

Directive 内にコメントが表示される場合、それは完全に削除されるのではなく、単一のスペースに置き換えられるようになりました。先頭、末尾、または複数のコロンを持つ無効な要素または属性名は、Name.Local フィールドに未修正のまま格納されます。

flag

フラグ宣言は、無効な名前が指定された場合にパニックを引き起こすようになりました。

go/build

新しいContext.ToolTags フィールドは、現在のGoツールチェーン構成に適したビルドタグを保持します。

go/format

Source およびNode 関数は、//go:build行を// +build行と同期するようになりました。ファイルに// +build行のみがある場合、それらはファイル内の適切な場所に移動され、対応する//go:build行が追加されます。それ以外の場合、// +build行は既存の//go:build行に基づいて上書きされます。詳細については、https://golang.org/design/draft-gobuild を参照してください。

go/parser

新しいSkipObjectResolution モード値は、識別子をその宣言に解決しないようにパーサーに指示します。これにより、解析速度が向上する可能性があります。

image

具体的な画像タイプ(RGBAGray16など)は、新しいRGBA64Image インターフェースを実装するようになりました。以前にdraw.Image を実装していた具体的なタイプは、image/drawパッケージの新しいインターフェースであるdraw.RGBA64Image も実装するようになりました。

io/fs

新しいFileInfoToDirEntry 関数は、FileInfoDirEntryに変換します。

math

mathパッケージは、3つの新しい定数MaxUintMaxIntMinIntを定義するようになりました。32ビットシステムでは、それらの値はそれぞれ2^32 - 12^31 - 1-2^31です。64ビットシステムでは、それらの値はそれぞれ2^64 - 12^63 - 1-2^63です。

mime

Unixシステムでは、MIMEタイプのテーブルが利用可能な場合、ローカルシステムのShared MIME-info Database から読み取られるようになりました。

mime/multipart

Part.FileName は、返される値にfilepath.Base を適用するようになりました。これにより、net/httpサーバーがRequest.FormFile を呼び出すようなマルチパートメッセージを受け入れるアプリケーションでのパストラバーサルの脆弱性が軽減されます。

net

新しいメソッドIP.IsPrivate は、アドレスがRFC 1918 に従ったプライベートIPv4アドレスか、RFC 4193 に従ったローカルIPv6アドレスかを報告します。Go DNSリゾルバは、IPv4のみまたはIPv6のみのネットワークのアドレスを解決する際に、両方のアドレスファミリをクエリするのではなく、1つのDNSクエリのみを送信するようになりました。ErrClosed センチネルエラーとParseError エラータイプは、net.Error インターフェースを実装するようになりました。ParseIP およびParseCIDR 関数は、先行ゼロを含む10進数コンポーネントを持つIPv4アドレスを拒否するようになりました。これらのコンポーネントは常に10進数として解釈されていましたが、一部のオペレーティングシステムはそれらを8進数として扱います。この不一致は、GoアプリケーションがIPアドレスを検証するために使用され、その後、コンポーネントを8進数として解釈する非Goアプリケーションで元の形式で使用される場合に、セキュリティ問題を引き起こす可能性があります。一般的に、検証後に値を再エンコードすることをお勧めします。これにより、この種のパーサーの不一致問題を回避できます。

net/http

net/httpパッケージは、クライアントまたはサーバーでTLSハンドシェイクを実行する際に、Request コンテキストを使用して新しい(*tls.Conn).HandshakeContext を使用するようになりました。ServerReadTimeoutまたはWriteTimeoutフィールドを負の値に設定すると、即時タイムアウトではなくタイムアウトなしを示すようになりました。ReadRequest 関数は、リクエストに複数のHostヘッダーがある場合にエラーを返すようになりました。URLのクリーンバージョンへのリダイレクトを生成する際に、ServeMux は常にLocationヘッダーに相対URLを使用するようになりました。以前は、リクエストの完全なURLをエコーしており、クライアントが絶対リクエストURLを送信するように仕向けられた場合に意図しないリダイレクトを引き起こす可能性がありました。net/httpによって処理される特定のHTTPヘッダーを解釈する際に、非ASCII文字は無視または拒否されるようになりました。Request.ParseFormRequest.ParseMultipartForm によって呼び出された際にエラーを返す場合、後者は返す前にRequest.MultipartForm を引き続き設定します。

net/http/httptest

ResponseRecorder.WriteHeader は、提供されたコードが有効な3桁のHTTPステータスコードでない場合にパニックを引き起こすようになりました。これは、net/httpパッケージのResponseWriter 実装の動作と一致します。

net/url

新しいメソッドValues.Has は、クエリパラメータが設定されているかどうかを報告します。

os

File.WriteString メソッドは、入力文字列のコピーを作成しないように最適化されました。

reflect

新しいValue.CanConvert メソッドは、値が型に変換できるかどうかを報告します。これは、スライスが短すぎる場合にスライスを配列ポインタ型に変換する際のパニックを回避するために使用できます。以前は、これにはType.ConvertibleTo を使用するだけで十分でしたが、スライスから配列ポインタ型への新たに許可された変換は、型が変換可能であってもパニックを引き起こす可能性があります。新しいStructField.IsExported およびMethod.IsExported メソッドは、構造体フィールドまたは型メソッドがエクスポートされているかどうかを報告します。これらは、PkgPathが空であるかどうかを確認するよりも読みやすい代替手段を提供します。新しいVisibleFields 関数は、匿名構造体メンバー内のフィールドを含む構造体型のすべての可視フィールドを返します。ArrayOf 関数は、負の長さで呼び出された場合にパニックを引き起こすようになりました。Type.ConvertibleTo メソッドをチェックするだけでは、Value.Convert の呼び出しがパニックを引き起こさないことを保証するのに十分ではなくなりました。スライスの長さがN未満の場合、[]T*[N]Tに変換する際にパニックを引き起こす可能性があります。上記の言語の変更 セクションを参照してください。Value.Convert およびType.ConvertibleTo メソッドは、異なるパッケージ内で同じ名前を持つ型を同一として扱わないように修正され、言語が許可するものと一致するようになりました。

runtime/metrics

新しいメトリクスが追加され、割り当ておよび解放された合計バイト数とオブジェクト数を追跡します。ゴルーチンのスケジューリング遅延の分布を追跡する新しいメトリクスも追加されました。

runtime/pprof

ブロックプロファイルは、頻繁な短いイベントよりもまれな長いイベントを優先するようにバイアスされなくなりました。

strconv

strconvパッケージは、浮動小数点数をフォーマットするためにUlf AdamsのRyūアルゴリズムを使用するようになりました。このアルゴリズムは、ほとんどの入力でパフォーマンスを向上させ、最悪のケースの入力で99%以上高速です。新しいQuotedPrefix 関数は、入力の先頭にある引用符付き文字列(Unquote で理解される)を返します。

strings

Builder.WriteRune メソッドは、他の無効なルーンと同様に、負のルーン値に対して置換文字U+FFFDを書き込むようになりました。

sync/atomic

atomic.Valueは、追加のアトミック操作を提供するSwap およびCompareAndSwap メソッドを持つようになりました。

syscall

GetQueuedCompletionStatus およびPostQueuedCompletionStatus 関数は非推奨となりました。これらの関数は不正確なシグネチャを持ち、golang.org/x/sys/windows パッケージの同等のものに置き換えられました。Unix系システムでは、子プロセスのプロセスグループが信号をブロックして設定されるようになりました。これにより、親がバックグラウンドプロセスグループにある場合に子にSIGTTOUが送信されるのを回避します。WindowsバージョンのSysProcAttr には2つの新しいフィールドがあります。AdditionalInheritedHandlesは、新しい子プロセスによって継承される追加のハンドルのリストです。ParentProcessは、新しいプロセスの親プロセスを指定することを許可します。定数MSG_CMSG_CLOEXECは、DragonFlyおよびすべてのOpenBSDシステムで定義されるようになりました(すでに一部のOpenBSDシステムおよびすべてのFreeBSD、NetBSD、Linuxシステムで定義されていました)。定数SYS_WAIT6およびWEXITEDは、NetBSDシステムで定義されるようになりました(SYS_WAIT6はすでにDragonFlyおよびFreeBSDシステムで定義されていました。WEXITEDはすでにDarwin、DragonFly、FreeBSD、Linux、Solarisシステムで定義されていました)。

testing

テストとベンチマークの実行順序を制御する新しいテストフラグ -shuffleが追加されました。新しいT.Setenv およびB.Setenv メソッドは、テストまたはベンチマークの期間中に環境変数を設定することをサポートします。

text/template/parse

新しいSkipFuncCheck モード値は、テンプレートパーサーが関数が定義されていることを確認しないように変更します。

time

Time 型には、fmtパッケージの%#vフォーマット指定子で印刷されたときにより有用な値を返すGoString メソッドが追加されました。新しいTime.IsDST メソッドは、時間が設定された場所で夏時間にあるかどうかを確認するために使用できます。新しいTime.UnixMilli およびTime.UnixMicro メソッドは、それぞれ1970年1月1日UTCから経過したミリ秒数とマイクロ秒数を返します。新しいUnixMilli およびUnixMicro 関数は、指定されたUnix時間に対応するローカル時間を返します。パッケージは、時間を解析およびフォーマットする際に、分数秒のセパレータとしてコンマ「,」を受け入れるようになりました。たとえば、次の時間レイアウトが受け入れられるようになりました:

bash
1
2
3
2006-01-02 15:04:05,999999999 -0700 MST
Mon Jan _2 15:04:05,000000 2006
Monday, January 2 15:04:05,000 2006

新しい定数Layout は、基準時間を定義します。

unicode

IsIsGraphicIsLetterIsLowerIsMarkIsNumberIsPrintIsPunctIsSpaceIsSymbol 、およびIsUpper 関数は、他の無効なルーンと同様に、負のルーン値に対してfalseを返すようになりました。


スポンサーリンク

共有

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