Go 1.13 リリースノート 日本語訳

この記事は https://golang.org/doc/go1.13 を日本語訳したものです. 前のバージョンはこちら: [Go 1.12 リリースノート 日本語訳](https://qiita.com/c-yan/items/5001121aa6a9566c7466). 次のバージョンはこちら: [Go 1.14 リリースノート 日本語訳](https://qiita.com/c-yan/items/3dd0c63ea4c3041728cc).

# Go 1.13 の紹介

最新の Go リリース、バージョン 1.13 は、[Go 1.12](https://golang.org/doc/go1.12) から6か月後に届きます. その変更点のほとんどは、ツールチェーン、ランタイム、およびライブラリの実装になります. いつものように、このリリースは Go 1 の[互換性の約束](https://golang.org/doc/go1compat)を守っています. 私たちは、ほとんどすべての Go プログラムが以前と同じようにコンパイルと実行し続けることを期待しています.

Go 1.13 では、Google が運用するミラーとチェックサムデータベースを使って、モジュールのダウンロードと認証をするのがデフォルトとなります. これらのサービスに関するプライバシー情報については、[https://proxy.golang.org/privacy](https://proxy.golang.org/privacy) を参照してください. また、これらのサーバの使用を無効にする方法や異なるサーバを使用する方法など、設定の詳細については、[go コマンドのドキュメント](https://golang.org/cmd/go/#hdr-Module_downloading_and_verification) を参照してください. もし、非パブリック・モジュールに依存している場合は、[あなたの環境の構成についてのドキュメント](https://golang.org/cmd/go/#hdr-Module_configuration_for_non_public_modules)を参照してください。

# 言語への変更

[数値リテラル提案](https://github.com/golang/proposal/blob/master/design/19308-number-literals.md)に従って、Go 1.13 はより均一でモダンな数値リテラルプレフィックスのセットをサポートする.

* [2進整数リテラル](https://golang.org/ref/spec#Integer_literals): プレフィックス `0b` や `0B` は、`0b1011` など、2進整数リテラルを示します.

* [8進整数リテラル](https://golang.org/ref/spec#Integer_literals): プレフィックス `0o` や `0O` は、`0o660` など、8進整数リテラルを示します. 先頭の `0` とそれに続く8進数による、既存の8進表記は有効なままです.

* [16進浮動小数点数リテラル](https://golang.org/ref/spec#Floating-point_literals): プレフィックス `0x`、`0X` は `0x1.0p-1021` のように16進形式で、浮動小数点数の仮数を表現することに使用することができます. 16進数の浮動小数点数は、`p` または `P` の文字のあとに10進の指数が書かれるような指数が必要です. 指数は仮数を2の冪乗でスケーリングします.

* [虚数リテラル](https://golang.org/ref/spec#Imaginary_literals): 虚数サフィックス `i` は、任意の(2進数、10進数、16進数)整数または浮動小数点リテラルと一緒に使用できるようになりました.

* 数字セパレータ: 数値リテラルの数字は、`1_000_000`、`0b_1010_0110`、`3.1415_9265` のように、アンダースコアを使用して区切る(グループ化する)ことができるようになりました. アンダースコアはどの2つの数字の間にも、リテラルプレフィックスと最初の数字の間にも出現することができます.

[符号付きシフトカウント提案](https://github.com/golang/proposal/blob/master/design/19113-signed-shift-counts.md)に従って、Go 1.13 は [シフトカウント](https://golang.org/ref/spec#Operators)が非負整数でなければならないという制限を削除しました. この変更は、単に `<<`、`>>` 演算子の制限(今回削除された)を満たすために導入された、多くの人工的な `uint` 変換の必要性を削除します.

これらの言語の変更は、コンパイラーへの変更及びパッケージライブラリ [`go/scanner`](https://golang.org/doc/go1.13#go/scanner)、[`text/scanner`](https://golang.org/doc/go1.13#text/scanner) (数値リテラル)、[`go/types`](https://golang.org/doc/go1.13#go/types) (符号付きシフトカウント) のための内部変更によって実装されました.

もしあなたのコードがモジュールを使っていて、`go.mod` ファイルで言語のバージョンを指定しているなら、これらの言語の変更にアクセスするためには少なくとも 1.13 に設定してください. `go.mod` ファイルを直接編集するか、`go mod edit -go=1.13` を実行することによって、これを行うことができます.

# ポート

Go 1.13 は Native Client (NaCl) 上で動作する最後のリリースとなります.

`GOARCH=wasm` では、新しい環境変数 `GOWASM` がバイナリをコンパイルする時に使用する、実験的な機能のカンマ区切りのリストを取ります.
有効な値は[こちら](https://golang.org/cmd/go/#hdr-Environment_variables)にドキュメントされています.

## AIX

PPC64 上の AIX (`aix/ppc64`)で cgo, 外部リンク, `c-archive` および `pie` ビルドモードをサポートするようになりました.

## Android

Go プログラムは Android 10 互換になりました.

## Darwin

Go 1.12 のリリースノートで[アナウンス](https://golang.org/doc/go1.12#darwin)されたとおり、Go 1.13 は macOS 10.11 El Capitan 以降を必要とします. 以前のバージョンのサポートは終了しました.

## FreeBSD

Go 1.12 のリリースノートで[アナウンス](https://golang.org/doc/go1.12#freebsd)されたとおり、Go 1.13 は FreeBSD 11.2 以降を必要とします. 以前のバージョンのサポートは終了しました. FreeBSD 12.0 以降では `COMPAT_FREEBSD11` オプションがセットされたカーネルを必要とします (これはデフォルトです).

## Illumos

Go は `GOOS=illumos` で Illumos をサポートするようになりました. `illumos` ビルドタグは `solaris` ビルドタグを意味します.

## Windows

内部リンクされた Windows バイナリで指定される Windows バージョンは、NT 4.0 ではなく Windows7 になりました. これはすでに Go の最低限必要なバージョンでしたが、下位互換モードを持つシステムコールの動作に影響を与える可能性があります. これらは文書化されているとおりに動作するようになります. 外部リンクされたバイナリ(cgo を使うプログラム)は、常により新しい Windows のバージョンを指定しています.

# ツール

## モジュール

### 環境変数

[`GO111MODULE`](https://golang.org/cmd/go/#hdr-Module_support) 環境変数は引き続きデフォルトで auto に設定されますが、auto の設定は、カレントワーキングディレクトリとそれ以下に `go.mod` ファイルが有っても、現在のディレクトリが `GOPATH/src` の中にあってすら、`go` コマンドのモジュール認識モードを有効にします. この変更は `GOPATH/src` 内の既存のコードの移行とモジュールを認識しないインポートの共にモジュールを認識するパッケージの継続的なメンテナンスを簡単にしました.

新しい [`GOPRIVATE`](https://golang.org/cmd/go/#hdr-Module_configuration_for_non_public_modules) 環境変数は、公開されていないモジュールパスを示します. これは、プロキシを介してフェッチされ、チェックサムデータベースを使用して検証されるモジュールの詳細な制御を提供する、下位レベルの `GONOPROXY` および `GONOSUMDB` 変数のデフォルト値として機能します.

[`GOPROXY` 環境変数](https://golang.org/cmd/go/#hdr-Module_downloading_and_verification) はプロキシ URL のカンマ区切りのリストか、特別トークンの `direct` で設定できるようになり、その[デフォルト値](https://golang.org/doc/go1.13#introduction)は `https://proxy.golang.org,direct` になりました. それに含まれているモジュールへのパッケージパスを解決する場合、 `go` コマンドはリスト内の各プロキシ上のすべての候補モジュールパスを連続して試します. プロキシに到達不能であったり、404 または 410 以外の HTTP ステータスコードを受け取った場合には、残りのプロキシを調べることなしに検索を終了します.

新しい [`GOSUMDB`](https://golang.org/cmd/go/#hdr-Module_authentication_failures) 環境変数は、メインモジュールの `go.sum` ファイルのリストに載っていないモジュールのチェックサムを調べるためのデータベースの名前とオプションで公開鍵とサーバ URL を識別します. もし `GOSUMDB` に明示的な URL が含まれていなければ、チェックサムデータベースのサポートを示すエンドポイントの `GOPROXY` URL を調査することによって URL は選ばれ、どのプロキシによってもサポートされていなければ指定のデータベースに直接接続するようフォールバックします. もし `GOSUMDB` が `off` に設定されていれば、チェックサムデータベースは調べられず、`go.sum` にすでに存在しているチェックサムのみが検証されます.

デフォルトのプロキシとチェックサムデータベースにアクセスできない(たとえば、ファイアウォールやサンドボックスの構成に起因します)ユーザは、`GOPROXY` を `direct`、 `GOSUMDB` を `off` に設定することで利用を無効にすることができます. [`go env -w`](https://golang.org/doc/go1.13#go-env-w) はプラットフォームに依存しないこれらの変数のデフォルト値の設定に使用することができます.

```
go env -w GOPROXY=direct
go env -w GOSUMDB=off
```

### `go get`

モジュール認識モードでは、`-u` を指定した [`go get`](https://golang.org/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) は、GOPATH モードでの `go get -u` で更新されるパッケージセットとより一貫性のある、より小さいセットのモジュールを更新するようになりました. `go get -u` はコマンドラインで指定されたモジュールとパッケージを更新し続けますが、指定されたパッケージを含むモジュールの推移的要求モジュールではなく、指定されたパッケージ **によってインポートされた** パッケージを含むモジュールのみを追加で更新します.

`go get -u` (追加の引数無しの) は現在のディレクトリの中のパッケージの推移的インポートのみを更新することを特に注意してください. 代わりに(テスト依存も含む)メインモジュールによって推移的にインポートされたパッケージの更新をするときは、`go get -u all` を使用します.

特に、get-u(追加の引数なしで)は現在のディレクトリにあるパッケージの推移的なインポートだけを更新することに注意してください. 代わりに、メインモジュール(テストの依存関係を含む)によって推移的にインポートされたすべてのパッケージを更新するには、go get-u allを使用します.

`go get -u` への上記の変更の結果として、`go get` サブコマンドは、パッケージをロードする前に停止するための `-m` フラグをサポートしなくなりました. `-d` フラグはまだサポートされており、指定されたパッケージの依存をビルドするために必要なソースコードをダウンロードした後に `go get` を停止することが引き続きできます.

デフォルトでは、モジュールモードでの `go get -u` は、GOPATH モードのようにテスト以外の依存のみをアップグレードします. また `go get` がコマンドラインで指定した パッケージ **のテスト** によってインポートされたパッケージを(GOPATH モードのように)含めることを引き起こす、`-t` フラグを受け付けるようになりました.

モジュール認識モードでは、`go get` サブコマンドはバージョンサフィックス `@patch` をサポートするようになりました. `@patch` サフィックスは、指定のモジュールや指定のパッケージを含むモジュールは、ビルドリストの中で見つかるバージョンと同じメジャーとマイナーバージョンを持つ最新のパッチリリースに更新されるべきであることを示します.

もし、バージョンサフィックス無しに `go get` に引数として渡されたモジュールが最新のリリースバージョンよりも新しいことを既に必要とする場合、より新しいバージョンのままになります. これは、モジュール依存の `-u` フラグの挙動と一貫性があります. これは、プレリリースバージョンからの予期しないダウングレードを予防します. 新しいバージョンサフィックスの `@upgrade` は、この挙動を明示的に要求します. `@latest` は、現在のバージョンに関係なく、明示的に最新バージョンを要求します.

### Version validation

バージョン管理システムからモジュールを抽出するときに、`go` コマンドは要求されたバージョン文字列に追加の検証を実行するようになりました.

`+incompatible` バージョンアノテーションは、モジュール導入以前のレポジトリに対する[セマンティックインポートバージョニング](https://golang.org/cmd/go/#hdr-Module_compatibility_and_semantic_versioning)の要求をバイパスします. `go` コマンドは、そのようなバージョンが明示的に `go.mod` ファイルに含まれていないことを、検証するようになりました.

`go` コマンドは、[疑似バージョン](https://golang.org/cmd/go/#hdr-Pseudo_versions)とバージョン管理のメタデータ間のマッピングを検証するようになりました. 具体的には以下です.

* バージョンプリフィックスは `vX.0.0` 形式であるか、指定のリビジョンの祖先のタグから派生しているか、指定したリビジョンそれ自身の[ビルドメタデータ](https://semver.org/#spec-item-10)を含むタグから派生している必要があります.

* 日付文字列は、リビジョンの UTC タイムスタンプと一致する必要があります.

* リビジョンのショートネームは、`go` コマンドが生成するのと同じ文字数を使用する必要があります. (`git` によって使用される SHA-1 ハッシュ は12桁のプレフィックス)

もし、[メインモジュール](https://golang.org/cmd/go/#hdr-The_main_module_and_the_build_list) の中の `require` ディレクティブが無効な疑似バージョンを使用するのであれば、バージョンを単にコミットハッシュに編集し、`go list -m all` や `go mod tidy` のような `go` コマンドを再度走らせることによって、大抵は修正することができます. 例えば

```
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
```

に解決されます.

メインモジュールの推移的依存性の1つが無効または擬似バージョンを必要とする場合、メインモジュールの `go.mod` ファイルの中で [`replace` ディレクティブ](https://golang.org/cmd/go/#hdr-The_go_mod_file) を使用することによって、無効なバージョンを有効なバージョンに置き換えることができます. もし置き換えがコミットハッシュの場合、上記のように適切な擬似バージョンに解決されます. 例えば

```
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 command

[`go env`](https://golang.org/cmd/go/#hdr-Environment_variables) は `go` コマンドによって認識されるユーザごとの環境変数のデフォルト値をセットするための `-w` フラグと、それと対となる以前設定したデフォルト値を解除する `-u` フラグを受け入れるようになりました. `go env -w` で設定されたデフォルト値は、[`os.UserConfigDir()`](https://golang.org/pkg/os/#UserConfigDir) 内の `go/env` ファイルに格納されます.

[`go version`](https://golang.org/cmd/go/#hdr-Print_Go_version) コマンドは、実行ファイルとディレクトリの名前を引数にとることができるようになりました. 実行ファイルに対して実行すると、`go version` は実行ファイルをビルドするのに使った Go のバージョンを表示します. もし `-m` フラグを使用すると、`go version` はもし可能であれば、実行ファイルの埋め込みモジュールのバージョン情報を表示します. ディレクトリに対して実行すると、`go version` はそのディレクトリとサブディレクトリに存在する実行ファイルについての情報を表示します.

新しい [`go build` フラグ](https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies) の `-trimpath` は、ビルドの再現性を向上させるため、コンパイルされた実行可能ファイルからすべてのファイルシステムパスを削除します.

もし `go build` に渡される `-o` フラグが既存のディレクトリを参照する場合、`go build` は、パッケージ引数に一致する `main` パッケージの実行可能ファイルをそのディレクトリ内に書き込むようになりました.

`go build` のフラグである `-tags` は、[`GOFLAGS`](https://golang.org/cmd/go/#hdr-Environment_variables) で複数のタグを許容するために、ビルドタグのリストをカンマ区切りで取るようになりました. スペース区切り形式は廃止予定になりましたが、まだ認識され維持されています.

[`go generate`](https://golang.org/cmd/go/#hdr-Generate_Go_files_by_processing_source) はファイルがディレクティブを検索してもビルド中は無視するための `generate` ビルドタグをセットするようになりました.

Go 1.12のリリースノートで[アナウンス](https://golang.org/doc/go1.12#binary-only)されたように、バイナリのみのパッケージはサポートされなくなりました. バイナリのみのパッケージ(`//go:binary-only-package` コメントでマークされている)をビルドすると、エラーが発生するようになりました.

## コンパイラツールチェーン

コンパイラにより精密なエスケープ解析が新しく実装されました. 大半の Go のコードが改善されるはずです(言い換えると、より多くの変数と式がヒープではなくスタックに割り当てられます).

しかしながら、この精度の向上は、以前は動作していた無効なコードを壊すかもしれません(例えば、[`unsafe.Pointer` の安全規則](https://golang.org/pkg/unsafe/#Pointer)に違反するコード).

関連していると思われる退行がある場合には、`go build -gcflags=all=-newescape=false` で古いエスケープ解析パスを再度有効にすることができます. 古いエスケープ解析を使用するオプションは、将来のリリースで削除される予定です.

コンパイラは、浮動小数点定数や複素数定数を `go_asm.h` に出力しなくなりました.
これらは常に、アセンブリコードで数値定数として使用できない形式で出力されます.

### Assembler

アセンブラは、ARM v 8.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` ウェブサーバはもはや主要なバイナリディストリビューションに含まれていません. `godoc` ウェブサーバをローカルで動かすためには、以下の手順で最初に手動インストールしてください.

```
go get golang.org/x/tools/cmd/godoc
godoc
```

The [`go doc`](https://golang.org/cmd/go/#hdr-Show_documentation_for_package_or_symbol) コマンドは、コマンドを除いて、常に出力にパッケージ項を含むようになりました. これは以前の、ある種の条件でパッケージ句が省略されることを引き起こしていた、ヒューリスティックを使った挙動を置き換えます

# ランタイム

範囲外パニックメッセージに、範囲外だったインデックスとスライスの長さ(または容量)が含まれるようになりました. たとえば、長さ1のスライスに対する `s[3]` は "runtime error: index out of range [3] with length 1" でパニックになります.

このリリースでは、ほとんどの `defer` 使用のパフォーマンスが30%改善しています.

ランタイムは、共同テナントアプリケーションで利用できるようにするために、OS にメモリをより積極的に返すようになりました. 以前までは、ランタイムはヒープサイズのスパイクのあと、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 のリリースノート](https://golang.org/doc/go1.12#tls_1_3)を参照してください.

## [crypto/ed25519](https://golang.org/pkg/crypto/ed25519/)

新しい [`crypto/ed25519`](https://golang.org/pkg/crypto/ed25519/) パッケージは、Ed25519 署名方式を実装しています. この機能は、以前は [`golang.org/x/crypto/ed25519`](https://godoc.org/golang.org/x/crypto/ed25519) で提供されていました. これは Go 1.13 以降で使用すると [`crypto/ed25519`](https://golang.org/pkg/crypto/ed25519/) のラッパーになります.

## エラーラッピング

Go 1.13 は[エラー値の提案](https://go.googlesource.com/proposal/+/master/design/29934-error-values.md)で最初に提案され、[関連するイシュー](https://golang.org/issue/29934)で議論されたような、エラーラッピングのサポートを含みます.

エラー `e` は `w` を返す `Unwrap` メソッドを提供することによって、別のエラー `w` を **ラップ** することができます.

`e` と `w` の両方がプログラムで利用できるので、`e` は `w` に追加コンテキストを提供したり、プログラムは `w` に基づいて決定を行うことができるから再解釈を提供したりすることが出来ます.

ラッピングをサポートするために、[`fmt.Errorf`](#fmt) はラップされたエラーを作成するための `%w` 述語を持つようになり、[`errors`](#errors) パッケージの3つの新しい関数 ([`errors.Unwrap`](https://golang.org/pkg/errors/#Unwrap)、[`errors.Is`](https://golang.org/pkg/errors/#Is)、[`errors.As`](https://golang.org/pkg/errors/#As)) はラップされたエラーのアンラッピングと検査の簡便化をします.

詳細については、[`errors` パッケージドキュメント](https://golang.org/pkg/errors/)を読むか、[エラー値 FAQ](https://golang.org/wiki/ErrorValueFAQ) を見てください. ブログ記事も間もなく掲載されます.

## ライブラリへの小さな変更

いつものように、Go 1の [互換性の約束](https://golang.org/doc/go1compat)を念頭に置いて行われた、ライブラリに対するさまざまな小さな変更と更新があります.

### [bytes](https://golang.org/pkg/bytes/)

新しい [`ToValidUTF8`](https://golang.org/pkg/bytes/#ToValidUTF8) 関数は、無効な UTF-8 バイトシーケンスのそれぞれの連続を与えられたスライスに置き換えた、与えられたバイトスライスのコピーを返します

### [context](https://golang.org/pkg/context/)

[`WithValue`](https://golang.org/pkg/context/#WithValue) によって返されるコンテキストの書式は、`fmt` に依存しなくなり、同様に文字列化されません. 直前の文字列化に依存するコードが影響を受ける可能性があります.

### [crypto/tls](https://golang.org/pkg/crypto/tls/)

SSL バージョン 3.0 (SSLv3) のサポートは[廃止予定になり、Go 1.14 で削除される予定です](https://golang.org/issue/32716). SSLv3 は TLS 以前の[暗号的には壊れた](https://tools.ietf.org/html/rfc7568) プロトコルであることに注意してください.

誤ってサーバサイドでデフォルト有効にされた Go 1.12 以外では、SSLv3 は常にデフォルトで無効でした. 再びデフォルト無効になりました. (SSLv3 はクライアントサイドではサポートされていませんでした.)

Ed25519 証明書を TLS 1.2 と 1.3 でサポートするようになりました.

### [crypto/x509](https://golang.org/pkg/crypto/x509/)

Ed25519キーは、RFC8410、ParsePKCS8PrivateKey、MarshalPKCS8PrivateKey、およびParsePKIXPublicKey関数によって証明書および証明書要求でサポートされるようになりました

Ed25519 キーは、[RFC 8410](https://www.rfc-editor.org/info/rfc8410) に従い、[`ParsePKCS8PrivateKey`](https://golang.org/pkg/crypto/x509/#ParsePKCS8PrivateKey)、[`MarshalPKCS8PrivateKey`](https://golang.org/pkg/crypto/x509/#MarshalPKCS8PrivateKey)、[`ParsePKIXPublicKey`](https://golang.org/pkg/crypto/x509/#ParsePKIXPublicKey) 関数によって、証明書および証明書要求でサポートされるようになりました.

Alpine Linux 3.7 以降のデフォルトの場所をサポートするために、システムルートとして検索するパスに `/etc/ssl/cert.pem` が含まれるようになりました.

### [database/sql](https://golang.org/pkg/database/sql/)

新しい [`NullTime`](https://golang.org/pkg/database/sql/#NullTime) 型は、null である可能性がある `time.Time` を表します.

新しい [`NullInt32`](https://golang.org/pkg/database/sql/#NullInt32) 型は、null である可能性がある `int32` を表します.

### [debug/dwarf](https://golang.org/pkg/debug/dwarf/)

[`Data.Type`](https://golang.org/pkg/debug/dwarf/#Data.Type) メソッドは、型グラフの中で不明な DWARF に遭遇しても、パニックしなくなりました.
代わりに、[`UnsupportedType`](https://golang.org/pkg/debug/dwarf/#UnsupportedType) オブジェクト型のコンポーネントを表します.

### [errors](https://golang.org/pkg/errors/)

新しい関数 [`As`](https://golang.org/pkg/errors/#As) は、与えられたエラーのチェーン(ラップされたエラーのシーケンス)内で、与えられたターゲットの型に一致する最初のエラーを探し、もし見つかれば、ターゲットをそのエラー値に設定します.

新しい関数 [`Is`](https://golang.org/pkg/errors/#Is) は、与えられたエラー値が別のチェーンのエラーと一致するかどうかを報告します.

新しい関数 [`Unwrap`](https://golang.org/pkg/errors/#Unwrap) は、もし存在すれば、与えられたエラーで `Unwrap` を呼んだ結果を返します.

### [fmt](https://golang.org/pkg/fmt/)

[`Errorf`](https://golang.org/pkg/fmt/#Errorf) 関数は、そのオペランドがエラーでなければならない、新しい述語 `%w` を持つようになりました. `Errorf` から返されるエラーは、`%w` のオペランドを返す `Unwrap` メソッドを持つようになります.

### [go/scanner](https://golang.org/pkg/go/scanner/)

新しい Go の数値リテラル、特に `0b`/`0B` プレフィックスの2進数リテラル、`0o`/`0O` プレフィックスの8進数リテラル、16進数仮数の浮動小数点数を認識するよう、スキャナが更新されました. 複素数のサフィックス `i` は、どんな数字リテラルと使用してもよくなり、アンダースコアはグループ化のための桁区切りとして使用してもよくなりました. 詳細については、 [言語への変更](https://golang.org/doc/go1.13#language) を参照してください.

### [go/types](https://golang.org/pkg/go/types/)

整数シフトの新しいルールに従うように、タイプチェッカーは更新されました. 詳細については、 [言語への変更](https://golang.org/doc/go1.13#language) を参照してください.

### [html/template](https://golang.org/pkg/html/template/)

type 属性に "module" をセットした `<script>` タグを使った時、コードが [JavaScript module script](https://html.spec.whatwg.org/multipage/scripting.html#the-script-element:module-script-2) として解釈されるようになりました.

### [log](https://golang.org/pkg/log/)

新しい [`Writer`](https://golang.org/pkg/log/#Writer) 関数は、標準ロガーの出力先を返します.

### [math/big](https://golang.org/pkg/math/big/)

新しい [`Rat.SetUint64`](https://golang.org/pkg/math/big/#Rat.SetUint64) メソッドは、`Rat` を `uint64` 値に設定します.

[`Float.Parse`](https://golang.org/pkg/math/big/#Float.Parse)に関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 [言語への変更](https://golang.org/doc/go1.13#language) を参照してください.

[`Int.SetString`](https://golang.org/pkg/math/big/#Int.SetString)に関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 [言語への変更](https://golang.org/doc/go1.13#language) を参照してください.

[`Rat.SetString`](https://golang.org/pkg/math/big/#Rat.SetString) は、十進数ではない浮動小数点表現を受け入れるようになりました.

### [math/bits](https://golang.org/pkg/math/bits/)

[`Add`](https://golang.org/pkg/math/bits/#Add)、[`Sub`](https://golang.org/pkg/math/bits/#Sub)、[`Mul`](https://golang.org/pkg/math/bits/#Mul)、[`RotateLeft`](https://golang.org/pkg/math/bits/#RotateLeft)、[`ReverseBytes`](https://golang.org/pkg/math/bits/#ReverseBytes) の実行時間が、入力に依存しないことが保証されるようになりました.

### [net](https://golang.org/pkg/net/)

`resolv.conf` に `use-vc` が設定されている UNIX システム上では、DNS 解決に TCP が使用されます.

新しいフィールド [`ListenConfig.KeepAlive`](https://golang.org/pkg/net/#ListenConfig.KeepAlive) は、リスナーによって受理されるネットワーク接続のキープアライブ時間を指定します. このフィールドが0(デフォルト)の場合、TCP キープアライブが有効になります. 無効にするには、負の値に設定します.

キープアライブタイムアウトによって閉じられた接続上の I/O が返したエラーは、もし呼ばれたら `true` を返す `Timeout` メソッドを持つことに注意してください. このため、キープアライブエラーは、[`SetDeadline`](https://golang.org/pkg/net/#Conn) メソッドや同様のメソッドで設定されたデッドラインに間に合わなかったために返ったエラーと区別するのが困難です. デッドラインを使用し、`Timeout` メソッドや [`os.IsTimeout`](https://golang.org/pkg/os/#IsTimeout) でそれらをチェックするコードは、キープアライブを無効にするか、キープアライブタイムアウトのときは true を返し、デッドラインタイムアウトのときは false を返す `errors.Is(syscall.ETIMEDOUT)` (Unix システム) を使用します.

### [net/http](https://golang.org/pkg/net/http/)

新しいフィールド [`Transport.WriteBufferSize`](https://golang.org/pkg/net/http/#Transport.WriteBufferSize) と [`Transport.ReadBufferSize`](https://golang.org/pkg/net/http/#Transport.ReadBufferSize) で、[`Transport`](https://golang.org/pkg/net/http/#Transport) の読み書きのバッファサイズが指定できます. いずれかのフィールドが 0 の場合、デフォルトサイズの 4KB が使用されます.

新しいフィールド [`Transport.ForceAttemptHTTP2`](https://golang.org/pkg/net/http/#Transport.ForceAttemptHTTP2) は、ゼロでない `Dial` 関数、 `DialTLS` 関数、`DialContext` 関数、`TLSClientConfig` が提供されたときに HTTP/2 を有効にするかどうかをコントロールします.

[`Transport.MaxConnsPerHost`](https://golang.org/pkg/net/http#Transport.MaxConnsPerHost) は HTTP/2 で正しく動作するようになりました.

[`TimeoutHandler`](https://golang.org/pkg/net/http/#TimeoutHandler) の [`ResponseWriter`](https://golang.org/pkg/net/http/#ResponseWriter) は、[`Pusher`](https://golang.org/pkg/net/http/#Pusher) と [`Flusher`](https://golang.org/pkg/net/http/#Flusher) インターフェースを実装するようになりました.

`StatusCode 103 "Early Hints"` が追加されました.

[`Transport`](https://golang.org/pkg/net/http/#Transport) は、可能であれば [`Request.Body`](https://golang.org/pkg/net/http/#Request.Body) の [`io.ReaderFrom`](https://golang.org/pkg/io/#ReaderFrom) 実装を使用して、ボディの書き込みを最適化するようになりました.

サポートしていない転送エンコーディングに遭遇したとき、[`http.Server`](https://golang.org/pkg/net/http/#Server) は、HTTP 仕様である [RFC 7230 Section 3.3.1](https://tools.ietf.org/html/rfc7230#section-3.3.1) で規定されているように "501 Unimplemented" ステータスを返すようになりました.

[`Server`](https://golang.org/pkg/net/http/#Server) の新しい [`BaseContext`](https://golang.org/pkg/net/http/#Server.BaseContext) フィールドと [`ConnContext`](https://golang.org/pkg/net/http/#Server.ConnContext) フィールドは、リクエストと接続に提供される [`Context`](https://golang.org/pkg/context/#Context) 値をより細かくコントロールすることを許可します.

[`http.DetectContentType`](https://golang.org/pkg/net/http/#DetectContentType) は RAR シグネチャを正しく検出できるようになり、同様に RAR v5 シグネチャも検出できるようになりました.

[`Header`](https://golang.org/pkg/net/http/#Header) の新しい [`Clone`](https://golang.org/pkg/net/http/#Header.Clone) メソッドは、レシーバーのコピーを返します.

新しい関数 [`NewRequestWithContext`](https://golang.org/pkg/net/http/#NewRequestWithContext) が追加され、[`Client.Do`](https://golang.org/pkg/net/http/#Client.Do) および [`Transport.RoundTrip`](https://golang.org/pkg/net/http/#Transport.RoundTrip) での使用に適した、作成された外向けの [`Request`](https://golang.org/pkg/net/http/#Request) の全生存期間を制御するコンテキストを受け入れるようになりました.

[`Transport`](https://golang.org/pkg/net/http/#Transport) は、`408 "Request Timeout"` を使って、アイドルな接続を丁寧に(gracefully)にシャットダウンしたとき、エラーをロギングしなくなりました.

### [os](https://golang.org/pkg/os/)

新しい [`UserConfigDir`](https://golang.org/pkg/os/#UserConfigDir) 関数は、ユーザ固有の設定データに使用するためのデフォルトディレクトリを返します,

もし [`File`](https://golang.org/pkg/os/#File) を O_APPEND フラグで開いたのであれば、[`WriteAt`](https://golang.org/pkg/os/#File.WriteAt) メソッドは常にエラーを返します.

### [os/exec](https://golang.org/pkg/os/exec/)

Windows では、[`Cmd.Env`](https://golang.org/pkg/os/exec/#Cmd.Env) フィールドに明示的な値が含まれていなければ、[`Cmd`](https://golang.org/pkg/os/exec/#Cmd) の環境は常に親プロセスの `%SYSTEMROOT%` の値を継承します.

### [reflect](https://golang.org/pkg/reflect/)

新しい [`Value.IsZero`](https://golang.org/pkg/reflect/#Value.IsZero) メソッドは、`Value` がその型のゼロ値であるかどうかをレポートします.

[`MakeFunc`](https://golang.org/pkg/reflect/#MakeFunc) 関数は、型の正確な一致を要求するのではなく、返り値で代入変換を許すようになりました. これは、返される型がインターフェース型で、実際に返される値はその型を実装する具体型であるときに特に便利です.

### [runtime](https://golang.org/pkg/runtime/)

トレースバック、[`runtime.Caller`](https://golang.org/pkg/runtime/#Caller)、[`runtime.Callers`](https://golang.org/pkg/runtime/#Callers") は、`PKG` のグローバル変数を初期化する関数を、`PKG.init.ializers` の代わりに `PKG.init` として参照するようになりました.

### [strconv](https://golang.org/pkg/strconv/)

[`strconv.ParseFloat`](https://golang.org/pkg/strconv/#strconv.ParseFloat)、[`strconv.ParseInt`](https://golang.org/pkg/strconv/#strconv.ParseInt)、[`strconv.ParseUint`](https://golang.org/pkg/strconv/#strconv.ParseUint) に関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 [言語への変更](https://golang.org/doc/go1.13#language) を参照してください.

### [strings](https://golang.org/pkg/strings/)

新しい [`ToValidUTF8`](https://golang.org/pkg/bytes/#ToValidUTF8) 関数は、無効な UTF-8 バイトシーケンスのそれぞれの連続を与えられた文字列に置き換えた、与えられた文字列のコピーを返します

### [sync](https://golang.org/pkg/sync/)

[`Mutex.Lock`](https://golang.org/pkg/sync/#Mutex.Lock)、[`Mutex.Unlock`](https://golang.org/pkg/sync/#Mutex.Unlock)、[`RWMutex.Lock`](https://golang.org/pkg/sync/#RWMutex.Lock)、[`RWMutex.RUnlock`](https://golang.org/pkg/sync/#Mutex.RUnlock)、[`Once.Do`](https://golang.org/pkg/sync/#Once.Do) は呼び出し元でインライン化されるようになりました. amd64 の競合しないケースでは、これらの変更により [`Once.Do`](https://golang.org/pkg/sync/#Once.Do) が倍速になり、[`Mutex`](https://golang.org/pkg/sync/#Mutex)/[`RWMutex`](https://golang.org/pkg/sync/#RWMutex) メソッドは10%速くなりました.

大きな [`Pool`](https://golang.org/pkg/sync/#Pool) はストップ・ザ・ワールドのポーズ時間を増やさなくなりました.

`Pool` は GC のたびに全て再生成する必要がなくなりました. 全てのオブジェクトを開放するのとは対照的に、GC 間でいくつかのオブジェクトは維持されるようになり、`Pool` のヘビーユーザは負荷のスパイクが軽減されています.

### [syscall](https://golang.org/pkg/syscall/)

Go のバイナリを macOS App Store にアップロードできるようにするために、Darwin のビルドから、`_getdirentries64` の使用が削除されました.

[`SysProcAttr`](https://golang.org/pkg/syscall/?GOOS=windows#SysProcAttr) の新しい `ProcessAttributes` フィールドと `ThreadAttributes` フィールドが Windows で導入され、新しいプロセスを作成したときに、セキュリティ設定をを公開するようになりました.

Windows 上でゼロ [`Chmod`](https://golang.org/pkg/syscall/?GOOS=windows#Chmod) モードで `EINVAL` が返ることはなくなりました.

`Errno` 型の値は、[`ErrExist`](https://golang.org/pkg/os/#ErrExist) のように [`errors.Is`](https://golang.org/pkg/errors/Is) を使用して、`os` パッケージ内のエラー値に対してテストができます.

### [syscall/js](https://golang.org/pkg/syscall/js/)

バイトスライスと `Uint8Array` の間でバイトコピーをするために、`TypedArrayOf` は [`CopyBytesToGo`](https://golang.org/pkg/syscall/js/#CopyBytesToGo) と [`CopyBytesToJS`](https://golang.org/pkg/syscall/js/#CopyBytesToJS) で置き換えられました.

### [testing](https://golang.org/pkg/testing/)

ベンチマークの実行時に、[`B.N`](https://golang.org/pkg/testing/#B.N) は四捨五入されなくなりました.

新しいメソッド [`B.ReportMetric`](https://golang.org/pkg/testing/#B.ReportMetric) で、ユーザーはカスタムベンチマークメトリクスをレポートしたり、組み込みメトリクスを上書きしたりすることができます.

テストフラグが、テストのために生成された `main` 関数によって呼び出される、新しい [`Init`](https://golang.org/pkg/testing/#Init) 関数に登録されるようになりました. 結果として、テストフラグはテストバイナリの実行時にのみ登録されるようになり、パッケージの初期化中に `flag.Parse` を呼ぶパッケージはテストの失敗を引き起こす可能性があります.

### [text/scanner](https://golang.org/pkg/text/scanner/)

新しい Go の数値リテラル、特に `0b`/`0B` プレフィックスの2進数リテラル、`0o`/`0O` プレフィックスの8進数リテラル、16進数仮数の浮動小数点数を認識するよう、スキャナが更新されました. また、新しい [`AllowDigitSeparators`](https://golang.org/pkg/text/scanner/#AllowDigitSeparators) モードでは、数値リテラルに桁区切り記号(後方互換性のためにデフォルトでオフ)としてアンダースコアを含めることができます. 詳細については、 [言語への変更](https://golang.org/doc/go1.13#language) を参照してください.

### [text/template](https://golang.org/pkg/text/template/)

新しい [slice 関数](https://golang.org/pkg/text/template/#hdr-Functions) は、最初の引数を以降の引数でスライスした結果を返します.

### [time](https://golang.org/pkg/time/)

[`Format`](https://golang.org/pkg/time/#Time.Format) と [`Parse`](https://golang.org/pkg/time/#Parse) で、通算日(Day-of-year)がサポートされるようになりました.

新しい [`Duration`](https://golang.org/pkg/time/#Duration) のメソッド [`Microseconds`](https://golang.org/pkg/time/#Duration.Microseconds) と [`Milliseconds`](https://golang.org/pkg/time/#Duration.Milliseconds) は、それぞれの名前の単位の整数カウントとして期間を返します.

### [unicode](https://golang.org/pkg/unicode/)

[`unicode`](https://golang.org/pkg/unicode/) パッケージと、システム全体の関連するサポートが Unicode 10.0 から、七つの新しいスクリプトと66の新しい絵文字を含む684の新しい文字が追加された [Unicode 11.0](http://www.unicode.org/versions/Unicode11.0.0/) に更新されました.