前書き
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 < N
。len(s)
がN
未満の場合、変換はパニックを引き起こします。
unsafe.Add
: unsafe.Add(ptr, len)
はlen
をptr
に加算し、更新されたポインタunsafe.Pointer(uintptr(ptr) + uintptr(len))
を返します。
unsafe.Slice
: 型*T
の式ptr
に対して、unsafe.Slice(ptr, len)
は基礎配列がptr
から始まり、長さと容量がlen
であるスライス型[]T
を返します。
パッケージunsafe
の拡張は、unsafe.Pointer
の安全性ルール
に準拠したコードを書くことを簡素化するために追加されましたが、ルール自体は変更されていません。特に、unsafe.Pointer
を正しく使用する既存のプログラムは有効なままであり、新しいプログラムもunsafe.Add
やunsafe.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に変換し、依存関係の選択されたバージョンを変更せずに実行するには、次のコマンドを実行します:
|
|
デフォルトでは、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との整合性をチェックせずに(またはチェックサムを保存せずに)実行するには、次のコマンドを実行します:
|
|
メインモジュールが-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 get
はgo.mod
の依存関係を変更するためにのみ使用されます。
go.modファイルにgo
ディレクティブがない場合
メインモジュールのgo.mod
ファイルにgoディレクティブ
が含まれておらず、go
コマンドがgo.mod
ファイルを更新できない場合、go
コマンドは現在のリリースではなくgo 1.11
を仮定します。(go mod init
はGo 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
がチャネルへの送信時にブロックしないため、信号が失われるリスクがあります。例えば:
|
|
signal.Notify
のユーザーは、予想される信号レートに対応するために十分なバッファスペースを持つチャネルを使用する必要があります。
Is、As、Unwrap メソッドに対する新しい警告
vet
ツールは、エラーインターフェースを実装する型において、errors
パッケージで期待されるシグネチャとは異なるシグネチャを持つAs
、Is
、Unwrap
という名前のメソッドについて警告するようになりました。errors.{As,Is,Unwrap}
関数は、そのようなメソッドがIs(error) bool
、As(interface{}) bool
、またはUnwrap() error
のいずれかを実装することを期待しています。errors.{As,Is,Unwrap}
関数は、同じ名前で異なるシグネチャを持つメソッドを無視します。例えば:
|
|
Cover
cover
ツールは、golang.org/x/tools/cover
からの最適化されたパーサーを使用するようになり、大きなカバレッジプロファイルを解析する際に顕著に高速になる可能性があります。
コンパイラ
Go 1.17は、関数の引数と結果をスタックではなくレジスタを使用して渡す新しい方法を実装しています。代表的なGoパッケージとプログラムのベンチマークでは、約5%のパフォーマンス向上と、バイナリサイズの約2%の削減が示されています。これは現在、64ビットx86アーキテクチャ(linux/amd64
、darwin/amd64
、windows/amd64
ポート)のLinux、macOS、およびWindowsで有効になっています。この変更は、安全なGoコードの機能には影響を与えず、ほとんどのアセンブリコードに影響を与えないように設計されています。関数引数にアクセスする際にunsafe.Pointer
ルールを違反するコードや、関数コードポインタの比較に関する未公開の動作に依存するコードに影響を与える可能性があります。既存のアセンブリ関数との互換性を維持するために、コンパイラは新しいレジスタベースの呼び出し規約と以前のスタックベースの呼び出し規約を変換するアダプタ関数を生成します。これらのアダプタは通常ユーザーには見えませんが、アセンブリコードでGo関数のアドレスを取得したり、Goコードでアセンブリ関数のアドレスをreflect.ValueOf(fn).Pointer()
やunsafe.Pointer
を使用して取得する場合、アダプタのアドレスが返されるようになります。これらのコードポインタの値に依存するコードは、期待通りに動作しなくなる可能性があります。アダプタはまた、2つのケースで非常に小さなパフォーマンスオーバーヘッドを引き起こす可能性があります: Goからアセンブリを介して間接的にアセンブリ関数を呼び出す場合、およびアセンブリからGo関数を呼び出す場合です。ランタイムからのスタックトレースの形式(未キャッチのパニックが発生した場合やruntime.Stack
が呼び出された場合に印刷される)は改善されました。以前は、関数引数はメモリレイアウトに基づいて16進数のワードとして印刷されていました。現在、ソースコード内の各引数はコンマで区切られて個別に印刷されます。集約型(構造体、配列、文字列、スライス、インターフェース、複素数)の引数は中括弧で区切られます。注意点として、レジスタ内にのみ存在しメモリに保存されていない引数の値は不正確である可能性があります。関数の戻り値(通常は不正確であった)はもはや印刷されません。クロージャを含む関数はインライン化できるようになりました。この変更の1つの効果は、クロージャを持つ関数がインライン化されるたびに異なるクロージャコードポインタを生成する可能性があることです。Go関数値は直接比較できませんが、この変更により、reflect
やunsafe.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=3
のQuery
メソッドは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.OpenRaw 、Writer.CreateRaw 、Writer.Copy は、パフォーマンスが主要な関心事である場合のサポートを提供します。
bufio
Writer.WriteRune メソッドは、他の無効なルーンと同様に、負のルーン値に対して置換文字U+FFFDを書き込むようになりました。
bytes
Buffer.WriteRune メソッドは、他の無効なルーンと同様に、負のルーン値に対して置換文字U+FFFDを書き込むようになりました。
compress/lzw
NewReader 関数は、新しい型Reader の値を返すことが保証されており、同様にNewWriter も新しい型Writer の値を返すことが保証されています。これらの新しい型はどちらも、Reader.Reset 、Writer.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
具体的な画像タイプ(RGBA
、Gray16
など)は、新しいRGBA64Image
インターフェースを実装するようになりました。以前にdraw.Image
を実装していた具体的なタイプは、image/draw
パッケージの新しいインターフェースであるdraw.RGBA64Image
も実装するようになりました。
io/fs
新しいFileInfoToDirEntry
関数は、FileInfo
をDirEntry
に変換します。
math
math
パッケージは、3つの新しい定数MaxUint
、MaxInt
、MinInt
を定義するようになりました。32ビットシステムでは、それらの値はそれぞれ2^32 - 1
、2^31 - 1
、-2^31
です。64ビットシステムでは、それらの値はそれぞれ2^64 - 1
、2^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
を使用するようになりました。Server
のReadTimeout
またはWriteTimeout
フィールドを負の値に設定すると、即時タイムアウトではなくタイムアウトなしを示すようになりました。ReadRequest
関数は、リクエストに複数のHost
ヘッダーがある場合にエラーを返すようになりました。URLのクリーンバージョンへのリダイレクトを生成する際に、ServeMux
は常にLocation
ヘッダーに相対URLを使用するようになりました。以前は、リクエストの完全なURLをエコーしており、クライアントが絶対リクエストURLを送信するように仕向けられた場合に意図しないリダイレクトを引き起こす可能性がありました。net/http
によって処理される特定のHTTPヘッダーを解釈する際に、非ASCII文字は無視または拒否されるようになりました。Request.ParseForm
がRequest.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時間に対応するローカル時間を返します。パッケージは、時間を解析およびフォーマットする際に、分数秒のセパレータとしてコンマ「,」を受け入れるようになりました。たとえば、次の時間レイアウトが受け入れられるようになりました:
|
|
新しい定数Layout は、基準時間を定義します。
unicode
Is
、IsGraphic
、IsLetter
、IsLower
、IsMark
、IsNumber
、IsPrint
、IsPunct
、IsSpace
、IsSymbol
、およびIsUpper
関数は、他の無効なルーンと同様に、負のルーン値に対してfalse
を返すようになりました。