Go 1.13 リリースノート
Go 1.13 の紹介¶
最新の Go リリースであるバージョン 1.13 は、Go 1.12 の 6 か月後にリリースされました。変更点のほとんどは、ツールチェーン、ランタイム、およびライブラリの実装にあります。いつものように、このリリースは Go 1 の 互換性の約束を維持しています。ほとんどすべての Go プログラムが以前と同様にコンパイルおよび実行されると予想されます。
Go 1.13 以降、go コマンドはデフォルトで、Google が実行する Go モジュールミラーおよび Go チェックサムデータベースを使用してモジュールをダウンロードおよび認証します。これらのサービスのプライバシー情報については https://proxy.golang.org/privacy を、これらのサーバーの使用を無効にする方法や別のサーバーを使用する方法を含む構成の詳細については、go コマンドのドキュメントを参照してください。非公開モジュールに依存する場合は、環境を構成するためのドキュメントを参照してください。
言語への変更¶
数値リテラル提案に基づき、Go 1.13 はより統一的で最新の数値リテラルプレフィックスのセットをサポートします。
- バイナリ整数リテラル:プレフィックス
0b
または0B
は、0b1011
のようなバイナリ整数リテラルを示します。 - 8 進数整数リテラル:プレフィックス
0o
または0O
は、0o660
のような 8 進数整数リテラルを示します。先頭が0
で始まる既存の 8 進数表記は引き続き有効です。 - 16 進数浮動小数点リテラル:プレフィックス
0x
または0X
を使用して、0x1.0p-1021
のような 16 進数形式で浮動小数点数の仮数を表現できるようになりました。16 進数浮動小数点数には、常に、文字p
またはP
の後に 10 進数で指数が続く形式で記述された指数が必要です。指数は、仮数を 2 の指数乗でスケーリングします。 - 虚数リテラル:虚数サフィックス
i
は、任意の(2 進数、10 進数、16 進数)整数または浮動小数点リテラルで使用できるようになりました。 - 桁区切り文字:任意の数値リテラルの桁を、
1_000_000
、0b_1010_0110
、または3.1415_9265
のようにアンダースコアを使用して区切る(グループ化する)ことができるようになりました。アンダースコアは、任意の 2 つの桁の間、またはリテラルプレフィックスと最初の桁の間に表示できます。
符号付きシフトカウント提案に基づき、Go 1.13 は シフトカウント が符号なしである必要があるという制限を削除します。この変更により、<<
および >>
演算子のこの(削除された)制限を満たすためだけに導入された多くの人工的な uint
変換の必要性がなくなります。
これらの言語の変更は、コンパイラーへの変更、および対応するライブラリパッケージ go/scanner
と text/scanner
(数値リテラル)、および go/types
(符号付きシフトカウント)への内部変更によって実装されました。
コードでモジュールを使用し、go.mod
ファイルで言語バージョンを指定している場合は、これらの言語の変更にアクセスするために、少なくとも 1.13
に設定されていることを確認してください。これは、go.mod
ファイルを直接編集するか、go mod edit -go=1.13
を実行することで実行できます。
ポート¶
Go 1.13 は、Native Client(NaCl)で実行される最後のリリースです。
GOARCH=wasm
の場合、新しい環境変数 GOWASM
は、バイナリがコンパイルされる際に使用される実験的な機能のコンマ区切りリストを取得します。有効な値はこちらに記載されています。
AIX¶
PPC64 の AIX(aix/ppc64
)は、cgo、外部リンク、および c-archive
および pie
ビルドモードをサポートするようになりました。
Android¶
Go プログラムは Android 10 と互換性があるようになりました。
Darwin¶
Go 1.12 リリースノートで発表されたように、Go 1.13 では macOS 10.11 El Capitan 以降が必要になりました。以前のバージョンのサポートは終了しました。
FreeBSD¶
Go 1.12 リリースノートで発表されたように、Go 1.13 では FreeBSD 11.2 以降が必要になりました。以前のバージョンのサポートは終了しました。FreeBSD 12.0 以降では、COMPAT_FREEBSD11
オプションが設定されたカーネルが必要です(これがデフォルトです)。
Illumos¶
Go は、GOOS=illumos
で Illumos をサポートするようになりました。illumos
ビルドタグは、solaris
ビルドタグを意味します。
Windows¶
内部リンクされた Windows バイナリで指定された Windows バージョンは、NT 4.0 ではなく Windows 7 になりました。これはすでに Go の最小必須バージョンでしたが、下位互換性モードがあるシステムコールの動作に影響を与える可能性があります。これらはドキュメントどおりに動作するようになります。外部リンクされたバイナリ(cgo を使用するプログラム)は、常に最新の Windows バージョンを指定していました。
ツール¶
モジュール¶
環境変数¶
GO111MODULE
環境変数は引き続きデフォルトで auto
ですが、auto
設定では、現在の作業ディレクトリに go.mod
ファイルを含むディレクトリが含まれているか、またはその下にある場合、現在のディレクトリが GOPATH/src
内にある場合でも、go
コマンドのモジュール対応モードがアクティブになります。この変更により、GOPATH/src
内の既存のコードの移行と、モジュール対応パッケージと非モジュール対応インポーターの継続的なメンテナンスが簡素化されます。
新しいGOPRIVATE
環境変数は、公開されていないモジュールパスを示します。これは、プロキシを介してフェッチされ、チェックサムデータベースを使用して検証されるモジュールをより細かく制御する、下位レベルの GONOPROXY
および GONOSUMDB
変数のデフォルト値として機能します。
GOPROXY
環境変数は、プロキシ URL のコンマ区切りリストまたは特別なトークン direct
に設定できるようになりました。そのデフォルト値は https://proxy.golang.org,direct
になりました。パッケージパスをそれを囲むモジュールに解決するとき、go
コマンドはリスト内の各プロキシで候補となるすべてのモジュールパスを順番に試みます。到達不能なプロキシまたは 404 または 410 以外の HTTP ステータスコードは、残りのプロキシを参照せずに検索を終了します。
新しい GOSUMDB
環境変数は、メインモジュールの go.sum
ファイルにまだリストされていないモジュールのチェックサムを照会するデータベースの名前、およびオプションで公開鍵とサーバー URL を識別します。GOSUMDB
に明示的な URL が含まれていない場合、URL はチェックサムデータベースのサポートを示すエンドポイントについて GOPROXY
URL をプロービングすることによって選択され、プロキシでサポートされていない場合は、名前付きデータベースへの直接接続にフォールバックします。GOSUMDB
が off
に設定されている場合、チェックサムデータベースは照会されず、go.sum
ファイル内の既存のチェックサムのみが検証されます。
デフォルトのプロキシとチェックサムデータベースにアクセスできないユーザー(たとえば、ファイアウォールまたはサンドボックス化された構成が原因)は、GOPROXY
を direct
に、または GOSUMDB
を off
に設定することで、それらの使用を無効にできます。go
env
-w
を使用して、プラットフォームに依存しないこれらの変数のデフォルト値を設定できます。
go env -w GOPROXY=direct
go env -w GOSUMDB=off
go
get
¶
モジュール対応モードでは、go
get
は -u
フラグを指定して、GOPATH モードで go
get
-u
によって更新されるパッケージのセットとより一致する、より小さなモジュールのセットを更新するようになりました。go
get
-u
は、コマンドラインで指定されたモジュールとパッケージを引き続き更新しますが、指定されたパッケージによってインポートされるパッケージを含むモジュールのみを追加で更新します。これは、指定されたパッケージを含むモジュールの推移的なモジュール要件ではなくなります。
特に、go
get
-u
(追加の引数なし)は、現在のディレクトリにあるパッケージの推移的なインポートのみを更新するようになりました。代わりに、メインモジュールによって推移的にインポートされたすべてのパッケージ(テストの依存関係を含む)を更新するには、go
get
-u
all
を使用します。
上記の go
get
-u
への変更の結果、go
get
サブコマンドは、パッケージのロード前に go
get
を停止させた -m
フラグをサポートしなくなりました。-d
フラグは引き続きサポートされており、名前付きパッケージの依存関係を構築するために必要なソースコードをダウンロードした後、go
get
を停止させ続けます。
デフォルトでは、モジュールモードの go
get
-u
は、GOPATH モードのように、テスト以外の依存関係のみをアップグレードします。-t
フラグも受け入れるようになりました(GOPATH モードと同様に)。これにより、コマンドラインで指定されたパッケージのテストによってインポートされたパッケージを go
get
に含めることができます。
モジュール対応モードでは、go
get
サブコマンドはバージョンサフィックス @patch
をサポートするようになりました。@patch
サフィックスは、名前付きモジュール、または名前付きパッケージを含むモジュールを、ビルドリストにあるバージョンと同じメジャーバージョンとマイナーバージョンを持つ最高のパッチリリースに更新する必要があることを示します。
バージョンサフィックスなしで go
get
の引数として渡されたモジュールが、最新のリリースバージョンよりも新しいバージョンで既に必要な場合、その新しいバージョンのままになります。これは、モジュールの依存関係に対する -u
フラグの動作と一致します。これにより、プレリリースバージョンからの予期しないダウングレードが防止されます。新しいバージョンサフィックス @upgrade
は、この動作を明示的に要求します。@latest
は、現在のバージョンに関係なく、最新バージョンを明示的に要求します。
バージョン検証¶
バージョン管理システムからモジュールを抽出するとき、go
コマンドは、要求されたバージョン文字列に対して追加の検証を実行するようになりました。
+incompatible
バージョンアノテーションは、モジュール導入前のリポジトリに対するセマンティックインポートバージョンの要件をバイパスします。go
コマンドは、そのようなバージョンに明示的な go.mod
ファイルが含まれていないことを確認するようになりました。
go
コマンドは、擬似バージョンとバージョン管理メタデータ間のマッピングを検証するようになりました。具体的には
- バージョンプレフィックスは、
vX.0.0
の形式であるか、名前付きリビジョンの先祖のタグから派生したものであるか、名前付きリビジョン自体に ビルドメタデータ を含むタグから派生したものでなければなりません。 - 日付文字列は、リビジョンの UTC タイムスタンプと一致する必要があります。
- リビジョンの短い名前は、
go
コマンドが生成するのと同じ文字数を使用する必要があります。(git
で使用される SHA-1 ハッシュの場合、12 桁のプレフィックス)。
メインモジュールの require
ディレクティブが無効な疑似バージョンを使用している場合、通常はバージョンをコミットハッシュだけにして go
コマンド (go
list
-m
all
や go
mod
tidy
など) を再実行することで修正できます。例えば、
require github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c
以下のように修正できます。
require github.com/docker/docker e7b5f7dbe98c
これは現在、以下のように解決されます。
require github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c
メインモジュールの推移的な依存関係のいずれかが無効なバージョンまたは疑似バージョンを必要とする場合、無効なバージョンは、メインモジュールの go.mod
ファイル内の replace
ディレクティブ を使用して有効なものに置き換えることができます。置換がコミットハッシュの場合、上記のように適切な疑似バージョンに解決されます。例えば、
replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker e7b5f7dbe98c
これは現在、以下のように解決されます。
replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c
Go コマンド¶
go
env
コマンドは、go
コマンドによって認識される環境変数のユーザーごとのデフォルト値を設定するための -w
フラグと、以前に設定したデフォルトを解除するための対応する -u
フラグを受け入れるようになりました。 go
env
-w
で設定されたデフォルトは、os.UserConfigDir()
内の go/env
ファイルに保存されます。
go
version
コマンドは、実行可能ファイルとディレクトリの名前を引数として受け入れるようになりました。実行可能ファイルで呼び出すと、go
version
はその実行可能ファイルのビルドに使用された Go のバージョンを出力します。 -m
フラグを使用すると、go
version
は実行可能ファイルに埋め込まれたモジュールバージョン情報 (利用可能な場合) を出力します。ディレクトリで呼び出すと、go
version
はディレクトリとそのサブディレクトリに含まれる実行可能ファイルに関する情報を出力します。
新しい go
build
フラグ -trimpath
は、コンパイルされた実行可能ファイルからすべてのファイルシステムパスを削除し、ビルドの再現性を向上させます。
go
build
に渡された -o
フラグが既存のディレクトリを参照する場合、go
build
は、そのディレクトリ内に、パッケージ引数に一致する main
パッケージの実行可能ファイルを書き込むようになります。
go
build
フラグ -tags
は、GOFLAGS
で複数のタグを許可するために、コンマ区切りのビルドタグのリストを受け入れるようになりました。スペース区切りの形式は非推奨ですが、引き続き認識され、維持されます。
go
generate
は、ビルド中にディレクティブの検索は行うものの無視できるように、generate
ビルドタグを設定するようになりました。
Go 1.12 リリースノートで 発表 されたように、バイナリのみのパッケージはサポートされなくなりました。バイナリのみのパッケージ (//go:binary-only-package
コメントでマークされている) をビルドすると、エラーが発生するようになりました。
コンパイラツールチェーン¶
コンパイラには、より正確なエスケープ解析の新しい実装があります。ほとんどの Go コードの場合、改善になるはずです (つまり、ヒープではなくスタックに割り当てられる Go 変数と式が増えます)。ただし、この精度の向上により、以前はたまたま動作していた無効なコード (たとえば、unsafe.Pointer
の安全ルールに違反するコード) も破損する可能性があります。関連すると思われる回帰に気づいた場合は、go
build
-gcflags=all=-newescape=false
で古いエスケープ解析パスを再度有効にできます。古いエスケープ解析を使用するオプションは、将来のリリースで削除されます。
コンパイラは、浮動小数点または複素数の定数を go_asm.h
ファイルに出力しなくなりました。これらは常に、アセンブリコードで数値定数として使用できない形式で出力されていました。
アセンブラ¶
アセンブラは、ARM v8.1 で導入された多くのアトミック命令をサポートするようになりました。
gofmt¶
gofmt
(およびそれに伴う go fmt
) は、数値リテラルのプレフィックスと指数を小文字を使用するように正規化しますが、16 進数はそのままにします。これにより、新しい 8 進数プレフィックス (0O
が 0o
になる) を使用する際の可読性が向上し、書き換えが一貫して適用されます。また、gofmt
は、10 進数の整数虚数リテラルから不要な先頭のゼロを削除するようになりました。(後方互換性のために、0
で始まる整数虚数リテラルは、8 進数ではなく 10 進数と見なされます。余分な先頭のゼロを削除することで、潜在的な混乱を回避します。) たとえば、0B1010
、0XabcDEF
、0O660
、1.2E3
、および 01i
は、gofmt
を適用すると、0b1010
、0xabcDEF
、0o660
、1.2e3
、および 1i
になります。
godoc
と go
doc
¶
godoc
Web サーバーは、メインのバイナリディストリビューションに含まれなくなりました。godoc
Web サーバーをローカルで実行するには、最初に手動でインストールしてください。
go get golang.org/x/tools/cmd/godoc
godoc
go
doc
コマンドは、コマンドを除き、出力に常にパッケージ句を含めるようになりました。これにより、以前のヒューリスティックな動作が置き換えられ、特定の条件下でパッケージ句が省略されていました。
ランタイム¶
範囲外のパニックメッセージには、範囲外だったインデックスとスライスの長さ (または容量) が含まれるようになりました。たとえば、長さ 1 のスライスで s[3]
を実行すると、「runtime error: index out of range [3] with length 1」というパニックが発生します。
このリリースでは、ほとんどの defer
の使用のパフォーマンスが 30% 向上しています。
ランタイムは、メモリをオペレーティングシステムに返すのをより積極的に行うようになり、同じテナントアプリケーションで利用できるようになりました。以前は、ランタイムはヒープサイズの急増後、5 分以上メモリを保持する可能性がありました。現在では、ヒープが縮小するとすぐにメモリを返すようになります。ただし、Linux を含む多くの OS では、OS 自体がメモリを遅延して再利用するため、システムにメモリの負荷がかかるまで、プロセスの RSS は減少しません。
標準ライブラリ¶
TLS 1.3¶
Go 1.12 で発表されたように、Go 1.13 では crypto/tls
パッケージで TLS 1.3 のサポートがデフォルトで有効になります。 GODEBUG
環境変数に値 tls13=0
を追加することで無効にできます。オプトアウトは Go 1.14 で削除されます。
重要な互換性情報については、Go 1.12 リリースノートを参照してください。
crypto/ed25519¶
新しい crypto/ed25519
パッケージは、Ed25519 署名スキームを実装します。この機能は、以前は golang.org/x/crypto/ed25519
パッケージによって提供されていましたが、Go 1.13 以降で使用すると crypto/ed25519
のラッパーになります。
エラーラッピング¶
Go 1.13 には、最初に エラー値提案 で提案され、関連する問題 で議論された、エラーラッピングのサポートが含まれています。
エラー e
は、w
を返す Unwrap
メソッドを提供することで、別のエラー w
を _ラップ_ できます。e
と w
の両方がプログラムで利用可能であるため、プログラムは w
に基づいて決定を下すことができますが、e
が w
に追加のコンテキストを提供したり、w
を再解釈したりできます。
ラッピングをサポートするために、fmt.Errorf
には、ラップされたエラーを作成するための %w
動詞が追加され、errors
パッケージに 3 つの新しい関数 ( errors.Unwrap
、errors.Is
、および errors.As
) が追加され、ラップされたエラーのアンラッピングと検査が簡単になります。
詳細については、errors
パッケージのドキュメントを参照するか、エラー値に関する FAQ を参照してください。まもなくブログ記事も公開されます。
ライブラリへの軽微な変更¶
いつものように、Go 1 の 互換性に関する約束 を念頭に置いて、ライブラリにはさまざまな軽微な変更と更新が加えられています。
bytes¶
新しい ToValidUTF8
関数は、指定された UTF-8 バイトシーケンスの各実行が無効なバイトシーケンスを、指定されたスライスで置き換えた、指定されたバイトスライスのコピーを返します。
context¶
WithValue
によって返されるコンテキストの書式設定は、fmt
に依存しなくなり、同じように文字列化されません。以前の正確な文字列化に依存するコードは影響を受ける可能性があります。
crypto/tls¶
SSL バージョン 3.0 (SSLv3) のサポートは、非推奨になり、Go 1.14 で削除されます。SSLv3 は、TLS の前の 暗号的に破損したプロトコルであることに注意してください。
SSLv3 は、Go 1.12 を除き、デフォルトでは常に無効になっていました。Go 1.12 では、サーバー側でデフォルトで誤って有効になっていました。現在は再びデフォルトで無効になっています。(SSLv3 はクライアント側ではサポートされていませんでした。)
Ed25519 証明書は、TLS バージョン 1.2 および 1.3 でサポートされるようになりました。
crypto/x509¶
Ed25519 キーは、RFC 8410 に従って、証明書と証明書リクエストでサポートされるようになり、ParsePKCS8PrivateKey
、MarshalPKCS8PrivateKey
、および ParsePKIXPublicKey
関数でもサポートされるようになりました。
システムルートで検索されるパスに、Alpine Linux 3.7+ のデフォルトの場所をサポートするために、/etc/ssl/cert.pem
が含まれるようになりました。
database/sql¶
新しい NullTime
型は、null になる可能性のある time.Time
を表します。
新しい NullInt32
型は、null になる可能性のある int32
を表します。
debug/dwarf¶
Data.Type
メソッドは、型グラフで不明な DWARF タグを検出した場合にパニックを起こさなくなりました。代わりに、型のそのコンポーネントを UnsupportedType
オブジェクトで表します。
errors¶
新しい関数 As
は、指定されたエラーのチェーン (ラップされたエラーのシーケンス) で、指定されたターゲットの型に一致する最初のエラーを見つけ、一致する場合は、ターゲットをそのエラー値に設定します。
新しい関数 Is
は、指定されたエラー値が、別のエラーのチェーン内のエラーと一致するかどうかを報告します。
新しい関数Unwrap
は、与えられたエラーにUnwrap
が存在する場合、それを呼び出した結果を返します。
fmt¶
書式指定の動詞%x
と%X
は、浮動小数点数と複素数を16進数表記で、それぞれ小文字と大文字で書式化するようになりました。
新しい書式指定の動詞%O
は、整数を8進数で書式化し、0o
プレフィックスを付加します。
スキャナーは、16進数の浮動小数点数、桁区切りアンダースコア、および先頭の0b
および0o
プレフィックスを受け入れるようになりました。詳細については、言語の変更点を参照してください。
Errorf
関数に新しい動詞%w
が追加されました。このオペランドはエラーでなければなりません。Errorf
から返されるエラーは、%w
のオペランドを返すUnwrap
メソッドを持ちます。
go/scanner¶
スキャナーが更新され、新しいGoの数値リテラル、具体的には0b
/0B
プレフィックスを持つバイナリリテラル、0o
/0O
プレフィックスを持つ8進数リテラル、および16進数仮数を持つ浮動小数点数を認識するようになりました。虚数接尾辞i
は、任意の数値リテラルで使用できるようになり、アンダースコアをグループ化のための桁区切り文字として使用できるようになりました。詳細については、言語の変更点を参照してください。
go/types¶
型チェッカーが更新され、整数のシフトに関する新しいルールに従うようになりました。詳細については、言語の変更点を参照してください。
html/template¶
<script>
タグでtype属性に“module”が設定されている場合、コードはJavaScriptモジュールスクリプトとして解釈されるようになりました。
log¶
新しいWriter
関数は、標準ロガーの出力先を返します。
math/big¶
新しいRat.SetUint64
メソッドは、Rat
をuint64
値に設定します。
Float.Parse
の場合、baseが0の場合、読みやすくするために数字の間にアンダースコアを使用できます。詳細については、言語の変更点を参照してください。
Int.SetString
の場合、baseが0の場合、読みやすくするために数字の間にアンダースコアを使用できます。詳細については、言語の変更点を参照してください。
Rat.SetString
は、非10進数の浮動小数点表現を受け入れるようになりました。
math/bits¶
Add
、Sub
、Mul
、RotateLeft
、およびReverseBytes
の実行時間は、入力に依存しないことが保証されるようになりました。
net¶
resolv.conf
でuse-vc
が設定されているUnixシステムでは、DNS解決にTCPが使用されます。
新しいフィールドListenConfig.KeepAlive
は、リスナーによって受け入れられたネットワーク接続のキープアライブ期間を指定します。このフィールドが0(デフォルト)の場合、TCPキープアライブが有効になります。無効にするには、負の値を設定します。
キープアライブタイムアウトによって閉じられた接続でのI/Oから返されるエラーには、呼び出された場合にtrue
を返すTimeout
メソッドがあることに注意してください。これにより、SetDeadline
メソッドや同様のメソッドによって設定された期限切れによるエラーと、キープアライブエラーを区別することが難しくなる可能性があります。期限を使用し、Timeout
メソッドまたはos.IsTimeout
で期限をチェックするコードは、キープアライブを無効にするか、errors.Is(syscall.ETIMEDOUT)
(Unixシステムの場合)を使用することをお勧めします。これにより、キープアライブタイムアウトの場合はtrueが返され、期限切れタイムアウトの場合はfalseが返されます。
net/http¶
新しいフィールドTransport.WriteBufferSize
とTransport.ReadBufferSize
を使用すると、Transport
の書き込みバッファと読み取りバッファのサイズを指定できます。いずれかのフィールドが0の場合、デフォルトのサイズ4KBが使用されます。
新しいフィールドTransport.ForceAttemptHTTP2
は、ゼロ以外のDial
、DialTLS
、またはDialContext
関数、またはTLSClientConfig
が提供されている場合にHTTP/2が有効になるかどうかを制御します。
Transport.MaxConnsPerHost
がHTTP/2で正しく動作するようになりました。
TimeoutHandler
のResponseWriter
がPusher
インターフェースを実装するようになりました。
StatusCode
103
"Early Hints"
が追加されました。
Transport
は、Request.Body
のio.ReaderFrom
実装が利用可能な場合、本体の書き込みを最適化するためにそれを使用するようになりました。
サポートされていない転送エンコーディングに遭遇した場合、http.Server
はHTTP仕様RFC 7230セクション3.3.1で義務付けられているように「501 Not Implemented」ステータスを返すようになりました。
新しいServer
フィールドBaseContext
とConnContext
により、リクエストと接続に提供されるContext
値をより細かく制御できます。
http.DetectContentType
がRAR署名を正しく検出するようになり、RAR v5署名も検出できるようになりました。
新しいHeader
メソッドClone
は、レシーバーのコピーを返します。
新しい関数NewRequestWithContext
が追加され、作成された送信Request
の全寿命を制御するContext
を受け入れます。Client.Do
およびTransport.RoundTrip
での使用に適しています。
Transport
は、サーバーが"408 Request Timeout"
応答を使用してアイドル接続を正常にシャットダウンしたときに、エラーをログに記録しなくなりました。
os¶
新しいUserConfigDir
関数は、ユーザー固有の設定データに使用するデフォルトのディレクトリを返します。
File
がO_APPENDフラグを使用して開かれた場合、そのWriteAt
メソッドは常にエラーを返します。
os/exec¶
Windowsでは、Cmd
の環境は、Cmd.Env
フィールドに明示的な値が含まれていない限り、常に親プロセスの%SYSTEMROOT%
値を継承します。
reflect¶
新しいValue.IsZero
メソッドは、Value
がその型のゼロ値であるかどうかを報告します。
MakeFunc
関数は、厳密な型の一致を要求する代わりに、戻り値の代入変換を許可するようになりました。これは、返される型がインターフェース型であるにもかかわらず、実際に返される値がその型を実装する具体的な値である場合に特に役立ちます。
runtime¶
トレースバック、runtime.Caller
、およびruntime.Callers
は、PKG
のグローバル変数を初期化する関数をPKG.init.ializers
ではなくPKG.init
として参照するようになりました。
strconv¶
strconv.ParseFloat
、strconv.ParseInt
、およびstrconv.ParseUint
の場合、baseが0の場合、読みやすくするために数字の間にアンダースコアを使用できます。詳細については、言語の変更点を参照してください。
strings¶
新しいToValidUTF8
関数は、無効なUTF-8バイトシーケンスの各実行が指定された文字列に置き換えられた、指定された文字列のコピーを返します。
sync¶
Mutex.Lock
、Mutex.Unlock
、RWMutex.Lock
、RWMutex.RUnlock
、およびOnce.Do
の高速パスが、呼び出し元にインライン化されるようになりました。amd64での競合のないケースの場合、これらの変更により、Once.Do
が2倍高速になり、Mutex
/RWMutex
メソッドが最大10%高速になります。
大きなPool
は、stop-the-worldの一時停止時間を増加させなくなりました。
Pool
は、すべてのGCの後に完全に再設定する必要がなくなりました。GCを跨いで一部のオブジェクトを保持するようになり、すべてのオブジェクトを解放するのではなく、Pool
のヘビーユーザーの負荷スパイクを軽減します。
syscall¶
Darwinビルドから_getdirentries64
の使用が削除され、GoバイナリをmacOS App Storeにアップロードできるようになりました。
SysProcAttr
にWindows用の新しいProcessAttributes
とThreadAttributes
フィールドが導入され、新しいプロセスを作成する際のセキュリティ設定が公開されるようになりました。
WindowsでゼロのChmod
モードでEINVAL
が返されなくなりました。
型Errno
の値は、errors.Is
を使用して、ErrExist
のようなos
パッケージのエラー値に対してテストできます。
syscall/js¶
TypedArrayOf
は、バイトスライスとUint8Array
の間でバイトをコピーするために、CopyBytesToGo
とCopyBytesToJS
に置き換えられました。
testing¶
ベンチマークを実行する場合、B.N
は丸められなくなりました。
新しいメソッドB.ReportMetric
を使用すると、ユーザーはカスタムベンチマークメトリックを報告し、組み込みのメトリックを上書きできます。
テストフラグは、テスト用に生成されたmain
関数によって呼び出される新しいInit
関数に登録されるようになりました。その結果、テストフラグはテストバイナリを実行する場合にのみ登録されるようになり、パッケージの初期化中にflag.Parse
を呼び出すパッケージは、テストを失敗させる可能性があります。
text/scanner¶
スキャナーが更新され、新しいGoの数値リテラル、具体的には0b
/0B
プレフィックスを持つバイナリリテラル、0o
/0O
プレフィックスを持つ8進数リテラル、および16進数仮数を持つ浮動小数点数を認識するようになりました。また、新しいAllowDigitSeparators
モードでは、数値リテラルに桁区切り文字としてアンダースコアを含めることができます(後方互換性のためにデフォルトではオフ)。詳細については、言語の変更点を参照してください。
text/template¶
新しいスライス関数は、最初の引数を次の引数でスライスした結果を返します。
time¶
年の日付は、Format
とParse
でサポートされるようになりました。
新しいDuration
メソッドMicroseconds
とMilliseconds
は、それぞれ指定された単位の整数カウントとして期間を返します。
unicode¶
システム全体で利用されているunicode
パッケージと関連サポートが、Unicode 10.0からUnicode 11.0にアップグレードされました。これにより、7つの新しいスクリプトを含む684の新しい文字と、66の新しい絵文字が追加されました。