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

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

# Go 1.16 の紹介

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

# 言語への変更

言語の変更はありません.

# ポート

## Darwin と iOS

Go 1.16 は `GOOS=darwin` と `GOARCH=arm64` で (Apple シリコンとして知られる) macOS の 64bit ARM アーキテクチャのサポートを追加します. `darwin/amd64` ポートのように、`darwin/arm64` ポートは cgo、内部及び外部リンク、`c-archive` や `c-shared` や `pie` ビルドモード、そして競合検出器をサポートします.

以前は `darwin/arm64` だった iOS ポートは `ios/arm64` にリネームされました. `GOOS=android` が `linux` ビルドタグを意味するように、`GOOS=ios` は `darwin` ビルドタグを意味します. この変更は iOS アプリをビルドするために gomobile を使用するどの人にも透明なはずです.

`GOOS=ios` の導入により、`x_ios.go` のようなファイル名は `GOOS=ios` に対してのみビルドされるようになりました. 詳細は [`go help buildconstraint`](https://golang.org/cmd/go/#hdr-Build_constraints) を参照してください. この形式のファイル名を使用している既存のパッケージはファイル名を変更する必要があります.

Go 1.16 は AMD64 ベースの macOS 上で動作する iOS シミュレータをターゲットとする `ios/amd64` ポートを追加しました. 以前にこれは `ios` ビルドタグをセットした `darwin/amd64` を通して非公式にサポートされていました. iOS と iOS シミュレータのためのプログラムのビルド方法の詳細については [`misc/ios/README`](https://golang.org/misc/ios/README) も参照してください.

Go 1.16 は macOS 10.12 Sierra で動作する最後のリリースです. Go 1.17 は macOS 10.13 High Sierra 以降が必要です.

## NetBSD

Go は NetBSD で 64 ビット ARM アーキテクチャをサポートするようになりました(`netbsd/arm64` ポート).

## OpenBSD

Go は OpenBSD で MIPS64 アーキテクチャをサポートするようになりました(`openbsd/mips64` ポート). このポートはまだ cgo をサポートしていません.

OpenBSD の 64bit x86 及び ARM アーキテクチャ(`openbsd/amd64` と `openbsd/arm64` ポート)は `SYSCALL/SVC` 命令を直接使うのではなく、`libc` を通してシステムコールをするようになりました. このことは、将来のバージョンの OpenBSD との前方互換性を保証します. 特に、OpenBSD 6.9 以降では、スタティックではない Go バイナリは `libc` を通したシステムコールが必要となります.

## 386

Go 1.15 のリリースノートで[アナウンス](https://golang.org/doc/go1.15#386)したように、Go 1.16 は x87 モードのコンパイル(`GO386=387`)のサポートを止めます. SSE2 を持たないプロセッサのサポートにはソフト浮動小数点モード(`GO386=softfloat`)が利用可能です. SSE2 を持たないプロセッサで走らせるユーザは `GO386=softfloat` で `GO386=387` を置き換える必要があります.

## RISC-V

`linux/riscv64` ポートは cgo と `-buildmode=pie` をサポートするようになりました. 今回のリリースには、RISC-V のパフォーマンスの最適化とコード生成の改善も含まれています.

# ツール

## Go コマンド

### モジュール

モジュール認識モードは、現在のワーキングディレクトリやパレントディレクトリに `go.mod` ファイルがあるかどうかに関係なく、デフォルトで有効になりました. より正確には、`GO111MODULE` 環境変数のデフォルトが `on` になりました. 以前の挙動に切り替えるには、`GO111MODULE` を `auto` に設定してください.

`go build` や `go test` などのビルドコマンドは、デフォルトでは `go.mod` や `go.sum` を変更しなくなりました. その代わりに、モジュールの要件やチェックサムを追加したり更新したりする必要がある場合にエラーを報告するようになりました(まるで `-mod=readonly` フラグが設定されているかのように). モジュールの要件やチェックサムは、`go mod tidy` や `go get` で調整することができます.

`go install` はバージョンサフィックスを持つ引数を受け入れるようになりました(例えば、`go install example.com/cmd@v1.0.0`). これにより、`go install` はカレントディレクトリや親ディレクトリがあればそれを無視して、モジュール認識モードでパッケージをビルド、インストールします. これは、メインモジュールの依存関係に影響を与えずに実行可能ファイルをインストールするのに便利です.

(上で説明した)バージョンサフィックスの有無に関わらず、`go install` はモジュールモードでパッケージをビルドしてインストールするための推奨される方法になりました. パッケージをビルドせずに現在のモジュールの依存関係を調整するには `go get` を `-d` フラグと一緒に使うべきで、`go get` でパッケージをビルドしてインストールすることは非推奨となりました. 将来のリリースでは、`-d` フラグは常に有効になります.

モジュールのある公開されたバージョンを、他のモジュールで使用してはいけないことを示すために `retract` ディレクティブを `go.mod` ファイルの中でしようできるようになりました. モジュールの作者は、深刻な問題が発見された後や、意図せずに公開されたときにバージョンを引っ込めることができます.

`go mod vendor` や `go mod tidy` サブコマンドは、不足しているパッケージの解決でエラーが発生しても続行するように指示する、`-e` フラグを受け入れるようになりました.

`go` コマンドは、メインモジュールの `exclude` ディレクティブによって除外されたモジュールのバージョンの要件を無視するようになりました. 以前は `go` コマンドは除外されたバージョンより高い次のバージョンを使用していましたが、そのバージョンは時間の経過とともに変化する可能性があり、結果として再現性のないビルドになっていました.

モジュールモードでは、`go` コマンドは、非 ASCII 文字や先頭がドット文字(`.`)であるパス要素を含むインポートパスを禁止するようになりました. これらの文字を含むモジュールパスは既に禁止されています([モジュールパスとバージョン](https://golang.org/ref/mod#go-mod-file-ident)を参照してください). ですので、この変更はモジュールのサブディレクトリ内のパスにのみ影響します.

### 埋め込みファイル

`go` コマンドは、新しい `//go:embed` ディレクティブを使用することによって、静的ファイルやファイルツリーを最終的な実行ファイルの一部に含むことをサポートしました. 詳細については新しい [`embed`](https://golang.org/pkg/embed/) パッケージのドキュメントを参照してください.

### `go test`

`go test` を使用する場合、テスト関数の実行中に `os.Exit(0)` を呼び出すテストは失敗と見做されるようになりました. これは、テストが `os.Exit(0)` を呼び出すコードを呼び出し、それによって将来のすべてのテストの実行を停止してしまうケースをキャッチするのに役立ちます. `TestMain` 関数が `os.Exit(0)` を呼んだ場合、それはまだテストを通過したと見做されます.

`go test` は `-c` または `-i` フラグと不明なフラグを同時に使用した場合、エラーを報告するようになりました. 通常、不明なフラグはテストに渡されますが、`-c` や `-i` が使われている場合にはテストは実行されません.

### `go get`

`go get -insecure` フラグは非推奨となり、将来のバージョンでは削除される予定です. このフラグは、HTTP のような安全でないスキームを使ってリポジトリから取得したり、カスタムドメインを解決することを許可し、またチェックサムデータベースを使ったモジュールのチェックサム検証をバイパスします. 安全でないスキームの使用を許可するには、代わりに環境変数 `GOINSECURE` を使用します. モジュールのチェックサムの検証をバイパスするには、`GOPRIVATE` か `GONOSUMDB` を使います. 詳細については `go help environment` を参照してください.

`go get example.com/mod@patch` は `example.com/mod` のあるバージョンがすでにメインモジュールで必要とされていることを要求するようになりました.　(ただし、`go get -u=patch` は新しく追加された依存関係にもパッチを適用し続けます.)

### `GOVCS` 環境変数

`GOVCS` は、`go` コマンドがソースコードをダウンロードする際に使用するバージョン管理ツールを制限する、新しい環境変数です. これにより、通常は信頼された認証済みの環境で使用されるツールのセキュリティの問題が緩和されます. デフォルトでは、`git` や `hg` はどのリポジトリからでもコードをダウンロードできるようになっています. `svn` や `bzr` や `fossil` は、`GOPRIVATE` 環境変数のパターンにマッチするモジュールパスやパッケージパスを持つリポジトリからのみコードをダウンロードすることができます. 詳細については [`go help vcs`](https://golang.org/cmd/go/#hdr-Controlling_version_control_with_GOVCS) を参照してください.

### `all` パターン

メインモジュールの `go.mod` ファイルが `go 1.16` 以降を宣言している場合、`all` パッケージパターンは、メインモジュールで見つかったパッケージやテストによって遷移的にインポートされたパッケージのみにマッチするようになりました. (メインモジュールでインポートされたパッケージの**テスト**でインポートされたパッケージは含まれなくなりました.) これは Go 1.11 以降、`go mod vendor` が保持しているパッケージのセットと同じです.

### `-toolexec` ビルドフラグ

コンパイルやアセンブルのようなツールチェーンプログラムを起動する際、プログラムを使うために `-toolexec` ビルドフラグが指定された場合、`TOOLEXEC_IMPORTPATH` 環境変数にビルド中のパッケージのインポートパスが設定されるようになりました.

### `-i` ビルドフラグ

`go build` や `go install` や `go test` で受け入れられていた `-i` フラグは非推奨になりました. `-i` フラグは、コマンドラインで指定されたパッケージによってインポートされたパッケージをインストールするように `go` コマンドに指示します. Go 1.10 でビルドキャッシュが導入されて以降、`-i` フラグはビルド時間に大きな影響を与えなくなり、インストールディレクトリが書き込み可能でない場合にエラーを引き起こすだけでした.

### `list` コマンド

`-export` フラグが指定された場合、`BuildID` フィールドにコンパイルされたパッケージのビルド ID がセットされるようになりました.
これは `go list -exported -f {{.Export}}` で `go tool buildid` を実行するのと同じですが、追加のステップがありません.

### `-overlay` フラグ

`-overlay` フラグは、ファイルパスの置換セットを含む JSON 設定ファイルを指定します. `-overlay` フラグはすべてのビルドコマンドと `go mod` サブコマンドで使用できます. これは gopls のようなエディタツールがソースファイルへの未保存の変更の影響を理解するために使われることを主眼としています. 設定ファイルは実際のファイルパスを置換ファイルパスにマッピングし、`go` コマンドとそのビルドは、実際のファイルパスが置換ファイルパスによって与えられた内容を持って存在するか、置換ファイルパスが空の場合は存在しないかのように実行されます.

## Cgo

[cgo](https://golang.org/cmd/cgo) ツールは、それらのサイズが Go で表現できる場合でも、C 構造体ビットフィールドを Go 構造体フィールドに変換することを試みないようになりました. C ビットフィールドがメモリに出現する順序は実装に依存しているため、cgo ツールが静かに誤った結果を生成することがありました.

## Vet

### goroutines の中での無効な testing.T の使用に対する新しい警告

vet ツールは、テスト中に作成された goroutine 内から `testing.T` の `Fatal` メソッドが不正に呼び出された場合に警告を表示するようになりました. これは `testing.T` テストや `testing.B` ベンチマークの `Fatalf` や `FailNow` や `Skip{,f,Now}` メソッド呼び出しでもまた警告します.

これらのメソッドを呼び出すと、作成された goroutine の実行が停止され、`Test*` や `Benchmark*` 関数の実行は停止されません. これらはテストやベンチマーク関数を実行している goroutine から呼び出される[必須](https://golang.org/pkg/testing/#T.FailNow)メソッドです. 例えば、

```go
func TestFoo(t *testing.T) {
    go func() {
        if condition() {
            t.Fatal("oops") // TestFoo の代わりに内部の func を終了します.
        }
        ...
    }()
}
```


作成された goroutine から `t.Fatal`(または同様のメソッド)を呼び出すコードは、`t.Error` を使ってテストの失敗を知らせ、`return` 文を使うなどの代替手段を使って goroutine を早期に脱出するように書き換えるべきです. 先ほどの例は次のように書き換えることができます.

```go
func TestFoo(t *testing.T) {
    go func() {
        if condition() {
            t.Error("oops")
            return
        }
        ...
    }()
}
```

### フレームポインタに対する新しい警告

vet ツールは、呼び出し規約に反して、BP レジスタ(フレームポインタ)を保存して復元することなく、BP レジスタ(フレームポインタ)を壊してしまう amd64 アセンブリについて警告するようになりました. BP レジスタを保持しないコードは、BP を全く使わないか、保存して復元することで BP を保持するように修正しなければなりません. BP を保持する簡単な方法は、フレームサイズを0以外の値に設定することで、生成されたプロローグとエピローグがあなたのために BP レジスタを保持するようになります. 修正例については [CL 248260](https://golang.org/cl/248260) を参照してください.

### asn1.Unmarshal に対する新しい警告

vet ツールは、ポインタでないものや nil な引数を [`asn1.Unmarshal`](https://golang.org/pkg/encoding/asn1/#Unmarshal) に誤って渡すことを警告するようになりました. これは、[`encoding/json.Unmarshal`](https://golang.org/pkg/encoding/json/#Unmarshal) や [`encoding/xml.Unmarshal`](https://golang.org/pkg/encoding/xml/#Unmarshal) に対する既存のチェックのようなものです.

# ランタイム

新しい [`runtime/metrics`](https://golang.org/pkg/runtime/metrics/) パッケージは、Go ランタイムから実装定義のメトリクスを読み取るための安定したインターフェイスを導入しました. これは [`runtime.ReadMemStats`](https://golang.org/pkg/runtime/#ReadMemStats) や [`debug.GCStats`](https://golang.org/pkg/runtime/debug/#GCStats) のような既存の関数に取って代わる、大いに汎用的で効率的一般的で効率的なものです. 詳細はパッケージのドキュメントを参照してください.

`GODEBUG` 環境変数を `inittrace=1` に設定すると、ランタイムは各パッケージ `init` の実行時間とメモリ割り当てをまとめた1行を標準エラーをに出力するようになりました. このトレースは、Go の起動パフォーマンスのボトルネックやリグレッションを見つけるために使用できます. [`GODEBUG` ドキュメント](https://golang.org/pkg/runtime/#hdr-Environment_Variables) に書式が記述されています.

Linuxでは、ランタイムはデフォルトで、オペレーティングシステムがメモリプレッシャーを受けているときに(`MADV_FREE` を使用して)怠惰に実行するのではなく、(`MADV_DONTNEED` を使用して)速やかにオペレーティングシステムにメモリを解放するようになりました. これは、RSS のようなプロセスレベルのメモリ統計が、Go プロセスが使用している物理メモリの量をより正確に反映することを意味します. 現在、`GODEBUG=madvdontneed=1` を使用してメモリ監視の動作を改善しているシステムでは、この環境変数を設定する必要はもはやありません.

Go 1.16 では、競合検出器と [Go メモリモデル](https://golang.org/ref/mem) の間の不一致が修正されました. 競合検出器は、メモリモデルのチャンネル同期ルールにより正確に従うようになりました. 結果として、以前は見逃していた競合を報告することができるようになりました.

# コンパイラ

コンパイラはラベルのない `for` ループ、メソッド値、型スイッチのある関数をインライン化できるようになりました. またインライン化可能な間接的な呼び出しもより検出できるようになりました.

# リンカ

このリリースには、Go リンカへの追加の改良が含まれており、リンカのリソース使用量(時間とメモリの両方)を削減し、コードの堅牢性と保守性を改善しています. これらの変更は、[Go リンカの近代化](https://golang.org/s/better-linker)のための2つのリリースプロジェクトの後半を形成しています.

1.16 のリンカの変更点は、1.15 の改善を、サポートされているすべてのアーキテクチャ/OS の組み合わせに拡張したことです(1.15 のパフォーマンスの改善は、主に `ELF` ベースの OS と `amd64` アーキテクチャに焦点を当てていました). 大規模な Go プログラムの代表的なセットでは、リンクは 1.15 よりも 20-25% 速くなり、`linux/amd64` では平均して 5-15% メモリ使用量が削減されており、他のアーキテクチャや OS では更に大きく改善されています. ほとんどのバイナリは、より積極的なシンボル刈り込みの結果として、より小さくなっています.

Windows において、`go build -buildmode=c-shared` がデフォルトで Windows ASLR DLL を生成するようになりました. ASLR は `--ldflags=-aslr=false` で無効にすることができます.

# コアライブラリ

## 埋め込みファイル

新しい [`embed`](https://golang.org/pkg/embed/) パッケージは、新しい [`//go:embed` directive](https://golang.org/doc/go1.16#embed) ディレクティブを使ってコンパイル時にプログラムに埋め込んだファイルへのアクセスを提供します.

## ファイルシステム

新しい [`io/fs`](https://golang.org/pkg/io/fs/) パッケージは、ファイルの読み取り専用ツリーの抽象化である [`fs.FS`](https://golang.org/pkg/io/fs/#FS) インターフェイスを定義しています. 標準のライブラリパッケージは、このインターフェースを適宜利用できるように作り変えられています.

生成側では、新しい [`embed.FS`](https://golang.org/pkg/embed/#FS) 型が、[`zip.Reader`](https://golang.org/pkg/archive/zip/#Reader) がそうしているように、`fs.FS` を実装しています. 新しい [`os.DirFS`](https://golang.org/pkg/os/#DirFS) 関数はオペレーティングシステムファイルのツリーをバックにして、`fs.FS` の実装を提供します.

消費側では、新しい [`http.FS`](https://golang.org/pkg/net/http/#FS) 関数が `fs.FS` を [`http.FileSystem`](https://golang.org/pkg/net/http/#FileSystemr) に変換します. また、[`html/template`](https://golang.org/pkg/html/template/) と [`text/template`](https://golang.org/pkg/text/template/) パッケージの [`ParseFS`](https://golang.org/pkg/html/template/#ParseFS) 関数とメソッドは、`fs.FS` からテンプレートを読み込みます.

`fs.FS` を実装したコードをテストするために、新しい [`testing/fstest`](https://golang.org/pkg/testing/fstest/) パッケージがよくある間違いをチェックして報告する [`TestFS`](https://golang.org/pkg/testing/fstest/#TestFS) 関数を提供します. また、`fs.FS` の実装を受け付けるコードをテストするために有益なシンプルなインメモリファイルシステムの実装として、[`MapFS`](https://golang.org/pkg/testing/fstest/#MapFS) を提供します.

## io/ioutil の非推奨化

[`io/ioutil`](https://golang.org/pkg/io/ioutil/) パッケージは定義がイマイチで理解しにくいもののコレクションであることが判明しました. このパッケージが提供するすべての機能は他のパッケージに移されました. `io/ioutil` パッケージは残り、今まで通り動作しますが、新しいコードでは [`io`](https://golang.org/pkg/io/) と [`os`](https://golang.org/pkg/os/) パッケージの新しい定義を使用することを推奨します.

こちらが `io/ioutil` でエクスポートされていた名前の新しい場所のリストになります.

* [`Discard`](https://golang.org/pkg/io/ioutil/#Discard) => [`io.Discard`](https://golang.org/pkg/io/#Discard)
* [`NopCloser`](https://golang.org/pkg/io/ioutil/#NopCloser) => [`io.NopCloser`](https://golang.org/pkg/io/#NopCloser)
* [`ReadAll`](https://golang.org/pkg/io/ioutil/#ReadAll) => [`io.ReadAll`](https://golang.org/pkg/io/#ReadAll)
* [`ReadDir`](https://golang.org/pkg/io/ioutil/#ReadDir) => [`os.ReadDir`](https://golang.org/pkg/os/#ReadDir) (注意: [`fs.FileInfo`](https://golang.org/pkg/fs/#FileInfo) のスライスではなく [`os.DirEntry`](https://golang.org/pkg/os/#DirEntry) のスライスを返します)
* [`ReadFile`](https://golang.org/pkg/io/ioutil/#ReadFile) => [`os.ReadFile`](https://golang.org/pkg/os/#ReadFile)
* [`TempDir`](https://golang.org/pkg/io/ioutil/#TempDir) => [`os.MkdirTemp`](https://golang.org/pkg/os/#MkdirTemp)
* [`TempFile`](https://golang.org/pkg/io/ioutil/#TempFile) => [`os.CreateTemp`](https://golang.org/pkg/os/#CreateTemp)
* [`WriteFile`](https://golang.org/pkg/io/ioutil/#WriteFile) => [`os.WriteFile`](https://golang.org/pkg/os/#WriteFile)

<!-- okay-after-beta1
TODO: decide if any additional changes are worth factoring out from
"Minor changes to the library" and highlighting in "Core library"
-->

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

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

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

新しい [`Reader.Open`](https://golang.org/pkg/archive/zip/#Reader.Open) メソッドが [`fs.FS`](https://golang.org/pkg/io/fs/#FS) インターフェースを実装しました.

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

[`crypto/dsa`](https://golang.org/pkg/crypto/dsa/) パッケージが非推奨になりました. [issue #40337](https://golang.org/issue/40337) も参照してください.

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

[`New`](https://golang.org/pkg/crypto/hmac/#New) は、ハッシュ生成関数への個別の呼び出しが新しい値を返すのに失敗した場合にパニックするようになりました. 以前は挙動が未定義であり、無効な出力が生成されることがありました.

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

閉じようとしている TLS 接続、または閉じた TLS 接続の I/O 操作は、新しい [`net.ErrClosed`](https://golang.org/pkg/net/#ErrClosed) エラーを使用して検出できるようになりました. 典型的な使用法は `errors.Is(err, net.ErrClosed)` です.

[`Conn.Close`](https://golang.org/pkg/crypto/tls/#Conn.Close) に、無期限にブロックされるのを防ぐために、"close notify" アラートを送信する前のデフォルトの書き込み期限が設定されました.

クライアントは、[クライアントによってアドバタイズされたリスト](https://golang.org/pkg/crypto/tls/#Config.NextProtos) にない [ALPN プロトコル](https://golang.org/pkg/crypto/tls/#ConnectionState.NegotiatedProtocol) をサーバが選択した場合、ハンドシェイクエラーを返すようになりました.

サーバは、クライアントまたはサーバが AES ハードウェアをサポートしていなかったり、[`Config.PreferServerCipherSuites`](https://golang.org/pkg/crypto/tls/#Config.PreferServerCipherSuites) と [`Config.CipherSuites`](https://golang.org/pkg/crypto/tls/#Config.CipherSuites) の両方が設定されていない場合、AES-GCM 暗号スイートの代わりに(ChaCha20Poly1305 のような)利用可能な他の AEAD 暗号スイートを優先するようになりました. クライアントが AES-GCM 暗号スイートの優先を合図していない場合は、AES ハードウェアをサポートしていないと見なされます.

[`Config.Clone`](https://golang.org/pkg/crypto/tls/#Config.Clone) はレシーバが nil の場合にパニックせずに nil を返すようになりました.

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

`GODEBUG=x509ignoreCN=0` フラグは、Go 1.17 で削除されます. これにより、Subject Alternative Names が存在しない場合に X.509 証明書の `CommonName` フィールドをホスト名として扱うという従来の動作が可能となっていました.

[`ParseCertificate`](https://golang.org/pkg/crypto/x509/#ParseCertificate) と [`CreateCertificate`](https://golang.org/pkg/crypto/x509/#CreateCertificate)は `DNSNames`、`EmailAddresses`、`URIs` フィールドに文字列エンコーディングの制限を適用するようになりました. これらのフィールドは、ASCII 範囲内の文字列のみ含むことができます.

[`CreateCertificate`](https://golang.org/pkg/crypto/x509/#CreateCertificate) は、署名者の公開鍵を使用して生成された証明書の署名を検証するようになりました. 署名が無効な場合は、不正な証明書の代わりに、エラーが返されます.

DSA 署名検証がサポートされなくなりました. DSA 署名生成は既にサポートされていないことに注意してください. [issue #40337](https://golang.org/issue/40337) を参照してください.

Windows で、[`Certificate.Verify`](https://golang.org/pkg/crypto/x509/#Certificate.Verify) は、最高ランクのチェーンだけではなく、プラットフォーム証明書検証器によって構築されたすべての証明書チェーンを返すようになりました.

新しい [`SystemRootsError.Unwrap`](https://golang.org/pkg/crypto/x509/#SystemRootsError.Unwrap) メソッドは、[`errors`](https://golang.org/pkg/errors) パッケージ関数を通して、[`Err`](https://golang.org/pkg/crypto/x509/#SystemRootsError.Err) フィールドへのアクセスを提供するようになりました.

Unix システムで、`crypto/x509` パッケージは、システム証明書プールのコピーを保存する方法がより効率的になりました. 少数のルート証明書のみを使用するプログラムは、約 0.5 メガバイトメモリ使用量が少なくなります.

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

さらなる [`DT`](https://golang.org/pkg/debug/elf/#DT_NULL) と [`PT`](https://golang.org/pkg/debug/elf/#PT_NULL) の定数が追加された.

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

[`Unmarshal`](https://golang.org/pkg/encoding/asn1/#Unmarshal) と [`UnmarshalWithParams`](https://golang.org/pkg/encoding/asn1/#UnmarshalWithParams) は、引数がポインタでないか nil である場合にパニックするのではなく、エラーを返すようになりました. この変更は [`encoding/json`](https://golang.org/pkg/encoding/json) のような他のエンコーディングパッケージの挙動と一致しています.

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

[`Marshal`](https://golang.org/pkg/encoding/json/#Marshal)、[`Unmarshal`](https://golang.org/pkg/encoding/json/#Unmarshal) および関連機能によって理解される `json` 構造体フィールドタグは、Go 構造体フィールドの JSON オブジェクト名内でセミコロン文字を許可するようになりました.

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

エンコーダは、XML 仕様で予約されている、`xml` で始まる名前空間接頭辞の使用を回避するように常に注意してきました. 今や、仕様にぴったり従うように、このチェックが大文字小文字を区別しないようになったため、`XML` や `XmL` などで始まる接頭辞も回避するようになりました.

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

新しい [`Func`](https://golang.org/pkg/flag/#Func) 関数は、[`Value`](https://golang.org/pkg/flag/#Value) インターフェースを実装する軽量な代替として、関数を呼び出すことによって実装されたフラグの登録を提供します.

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

[`Package`](https://golang.org/pkg/go/build/#Package) 構造体には、パッケージ内の `//go:embed` ディレクティブに関する情報を報告する新しいフィールドがあります. [`EmbedPatterns`](https://golang.org/pkg/go/build/#Package.EmbedPatterns)、[`EmbedPatternPos`](https://golang.org/pkg/go/build/#Package.EmbedPatternPos)、[`TestEmbedPatterns`](https://golang.org/pkg/go/build/#Package.TestEmbedPatterns)、[`TestEmbedPatternPos`](https://golang.org/pkg/go/build/#Package.TestEmbedPatternPos)、[`XTestEmbedPatterns`](https://golang.org/pkg/go/build/#Package.XTestEmbedPatterns)、[`XTestEmbedPatternPos`](https://golang.org/pkg/go/build/#Package.XTestEmbedPatternPos) です.

[`Package`](https://golang.org/pkg/go/build/#Package) フィールドの [`IgnoredGoFiles`](https://golang.org/pkg/go/build/#Package.IgnoredGoFiles) は、"_" または "." で始まるファイルを含まなくなります. `IgnoredGoFiles` は、ビルドの制約のために無視されるファイルのためのものです.

新しい [`Package`](https://golang.org/pkg/go/build/#Package) フィールド [`IgnoredOtherFiles`](https://golang.org/pkg/go/build/#Package.IgnoredOtherFiles) は、ビルド制約のために無視される Go 以外のファイルのリストを持ちます.

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

新しい [`template.ParseFS`](https://golang.org/pkg/html/template/#ParseFS) 関数と [`template.Template.ParseFS`](https://golang.org/pkg/html/template/#Template.ParseFS) メソッドは [`template.ParseGlob`](https://golang.org/pkg/html/template/#ParseGlob) と [`template.Template.ParseGlob`](https://golang.org/pkg/html/template/#Template.ParseGlob) のようなものですが、[`fs.FS`](https://golang.org/pkg/io/fs/#FS) からテンプレートを読みます.

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

[`ReadSeekCloser`](https://golang.org/pkg/io/#ReadSeekCloser) インターフェースが定義されました.

[`io/ioutil`](https://golang.org/pkg/io/ioutil/) パッケージ内の同じ名前の代わりに使うための、[`Discard`](https://golang.org/pkg/io/#Discard) や [`NopCloser`](https://golang.org/pkg/io/#NopCloser) や [`ReadAll`](https://golang.org/pkg/io/#ReadAll) がパッケージに定義されました.

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

新しい [`Default`](https://golang.org/pkg/log/#Default) 関数はデフォルト [`Logger`](https://golang.org/pkg/log/#Logger) へのアクセスを提供します.

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

[`Writer`](https://golang.org/pkg/log/syslog/#Writer) は、カスタム Unix ドメインソケットにロギングする際に、デフォルトのログソケットで既に使用されているフォーマットに合わせて、(ホスト名を省略し、より短いタイムスタンプを使用する)ローカルメッセージのフォーマットを使用するようになりました.

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

[`Reader`](https://golang.org/pkg/mime/multipart/#Reader) の [`ReadForm`](https://golang.org/pkg/mime/multipart/#Reader.ReadForm) メソッドは、制限として int64 の最大値を渡したときでも、フォームデータを拒否しなくなりました.

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

閉じようとしているネットワーク接続、または I/O が完了する前に閉じられたネットワーク接続の I/O 操作は、新しい [`ErrClosed`](https://golang.org/pkg/net/#ErrClosed) エラーを使用して検出できるようになりました. 典型的な使用法は `errors.Is(err, net.ErrClosed)` です. 以前のリリースでは、このケースを確実に検出する唯一の方法は `Error` メソッドが返す文字列と `"use of closed network connection"` をマッチさせることでした.

以前の Go リリースでは、`/proc/sys/net/core/somaxconn` で設定されている、Linux システム上のデフォルトの TCP リスナーバックログサイズは最大で `65535` に制限されていました, Linux カーネルバージョン 4.1 以上では、最大値は `4294967295` になりました.

Linux で、ホスト名検索は `/etc/nsswitch.conf` が見つからない場合、`/etc/hosts` をチェックする前に DNS を使用することはなくなりました. これは musl ベースのシステムでよく見られることで、Go プログラムがそれらのシステム上の C プログラムの動作と一致するようになりました.

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

[`net/http`](https://golang.org/pkg/net/http/) パッケージで、リクエスト URL の `Path` フィールドに加えて `RawPath` フィールドからプレフィックスを削除するよう、[`StripPrefix`](https://golang.org/pkg/net/http/#StripPrefix) の動作が変更されました. 過去のリリースでは、`Path` フィールドのみが削除されていたため、リクエスト URL にエスケープされた文字が含まれていた場合、URL は `Path` と `RawPath` フィールドが不一致になるように修正されていました. Go 1.16 では、`StripPrefix` は両方のフィールドをトリミングします. リクエスト URL のプレフィックス部分にエスケープされた文字がある場合、ハンドラは以前の動作である `Path`/`RawPath` ペアが一致していないハンドラを呼び出す代わりに 404 を提供します.

[`net/http`](https://golang.org/pkg/net/http/) パッケージは、例えば `"Range": "bytes=--2"` のような `"-N"` が負のサフィックス長の `"Range": "bytes=--N"` 形式の HTTP 範囲リクエストを拒否するようになりました. 今は `416 "Range Not Satisfiable"` 応答を返します.

[`SameSiteDefaultMode`](https://golang.org/pkg/net/http/#SameSiteDefaultMode) で設定されたクッキーは、値のない SameSite キーを生成するのではなく、現在の仕様(属性を設定しない)に従って動作するようになりました.

[`Client`](https://golang.org/pkg/net/http/#Client) は、既存の `POST` と `PUT` の動作にマッチするように、空のボディを持つ `PATCH` リクエストで `Content-Length: 0` ヘッダを明示的に送信するようになりました.

[`ProxyFromEnvironment`](https://golang.org/pkg/net/http/#ProxyFromEnvironment) 関数は、`HTTPS_PROXY` が設定されていないときに、`https://` URL のために `HTTP_PROXY` 環境変数の設定を返さなくなりました.

[`Transport`](https://golang.org/pkg/net/http/#Transport) 型は、`CONNECT` リクエストの際にプロキシに送るヘッダを返す関数に設定することができる、新しいフィールド [`GetProxyConnectHeader`](https://golang.org/pkg/net/http/#Transport.GetProxyConnectHeader) を持つようになりました. 事実上 `GetProxyConnectHeader` は既存のフィールド [`ProxyConnectHeader`](https://golang.org/pkg/net/http/#Transport.ProxyConnectHeader) の動的バージョンで、`GetProxyConnectHeader` が `nil` でない場合は、`ProxyConnectHeader` は無視されます.

新しい [`http.FS`](https://golang.org/pkg/net/http/#FS) 関数は、[`fs.FS`](https://golang.org/pkg/io/fs/#FS) を [`http.FileSystem`](https://golang.org/pkg/net/http/#FileSystemr) に変換します.

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

[`ReverseProxy`](https://golang.org/pkg/net/http/httputil/#ReverseProxy) はボディ長が不明なストリームレスポンスを中継するとき、より積極的にバッファをフラッシュするようになりました.

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

[`Client`](https://golang.org/pkg/net/smtp/#Client) の [`Mail`](https://golang.org/pkg/net/smtp/#Client.Mail) メソッドは、アドレスが UTF-8 でエンコードされていることを示す、`SMTPUTF8` ディレクティブをサポートするサーバに、それを送信するようになりました.

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

[`Process.Signal`](https://golang.org/pkg/os/#Process.Signal) は、プロセスが既に終了している場合に、エクスポートされていない `errFinished` の代わりに [`ErrProcessDone`](https://golang.org/pkg/os/#ErrProcessDone) を返すようになりました.

パッケージに [`fs.DirEntry`](https://golang.org/pkg/io/fs/#DirEntry) のエイリアスとして、新しい [`DirEntry`](https://golang.org/pkg/os/#DirEntry) 型が定義されました. 新しい [`ReadDir`](https://golang.org/pkg/os/#ReadDir) 関数と、新しい [`File.ReadDir`](https://golang.org/pkg/os/#File.ReadDir) メソッドは、ディレクトリの内容を [`DirEntry`](https://golang.org/pkg/os/#DirEntry) のスライスに読み込むことに使用できます. [`File.Readdir`](https://golang.org/pkg/os/#File.Readdir) メソッド(`dir` の小文字 `d` に注意) はまだ存在し、[`FileInfo`](https://golang.org/pkg/os/#FileInfo) のスライスを返しますが、ほとんどのプログラムでは [`File.ReadDir`](https://golang.org/pkg/os/#File.ReadDir) に切り替えた方が効率的です。

[`io/ioutil`](https://golang.org/pkg/io/ioutil/) パッケージ内で定義されている関数の代わりに使うための、[`CreateTemp`](https://golang.org/pkg/os/#CreateTemp)、[`MkdirTemp`](https://golang.org/pkg/os/#MkdirTemp)、[`ReadFile`](https://golang.org/pkg/os/#ReadFile)、[`WriteFile`](https://golang.org/pkg/os/#WriteFile) がこのパッケージに定義されました.

[`FileInfo`](https://golang.org/pkg/os/#FileInfo)、[`FileMode`](https://golang.org/pkg/os/#FileMode)、[`PathError`](https://golang.org/pkg/os/#PathError) の各型は、[`io/fs`](https://golang.org/pkg/io/fs/) パッケージ内の同名の型のエイリアスになりました. [`os`](https://golang.org/pkg/os/) パッケージの関数シグネチャは、[`io/fs`](https://golang.org/pkg/io/fs/) パッケージの名前を参照するように更新されました. これが既存のコードに影響を与えることはありません.

新しい [`DirFS`](https://golang.org/pkg/os/#DirFS) 関数は、オペレーティングシステムファイルのツリーをバックにした [`fs.FS`](https://golang.org/pkg/io/fs/#FS) 実装を提供します.

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

新しい [`NotifyContext`](https://golang.org/pkg/os/signal/#NotifyContext) 関数は、特定のシグナルの到着時にキャンセルされるコンテキストの作成を提供します.

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

[`Match`](https://golang.org/pkg/path/#Match) 関数は、パターンの未マッチ部分に構文エラーがある場合にエラーを返すようになりました. 以前は、関数はマッチの失敗時に早期に戻ったため、パターンの中のその後の構文エラーは報告されませんでした.

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

新しい関数 [`WalkDir`](https://golang.org/pkg/path/filepath/#WalkDir) は [`Walk`](https://golang.org/pkg/path/filepath/#Walk) に似ていますが、典型的にはより効率的です. `WalkDir` に渡される関数は [`fs.FileInfo`](https://golang.org/pkg/io/fs/#FileInfo) の代わりに [`fs.DirEntry`](https://golang.org/pkg/io/fs/#DirEntry) を受け取ります. (`Walk` 関数が [`os.FileInfo`](https://golang.org/pkg/os/#FileInfo) を受け取るものであったことを覚えている人のために明確にすると、`os.FileInfo` は現在 `fs.FileInfo` のエイリアスとなっています.)

[`Match`](https://golang.org/pkg/path/filepath#Match) および [`Glob`](https://golang.org/pkg/path/filepath#Glob) 関数は、パターンの非マッチ部分に構文エラーがある場合にエラーを返すようになりました. 以前は、関数はマッチに失敗した時点で早期に戻ったため、パターンの中のその後の構文エラーは報告されませんでした.

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

`SetPanicOnFault` が有効なときに使用される [`runtime.Error`](https://golang.org/pkg/runtime#Error) 値に `Addr` メソッドが追加されました. そのメソッドが存在する場合、フォールトのトリガーとなったメモリアドレスを返します.

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

[`ParseFloat`](https://golang.org/pkg/strconv/#ParseFloat) は [Eisel-Lemire アルゴリズム](https://nigeltao.github.io/blog/2020/eisel-lemire.html)を使用するようになり、パフォーマンスが最大2倍改善しました. これにより、[`encoding/json`](https://golang.org/pkg/encoding/json/) のようなテキスト形式のデコードも高速化されます,

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

[`NewCallback`](https://golang.org/pkg/syscall/?GOOS=windows#NewCallback) と [`NewCallbackCDecl`](https://golang.org/pkg/syscall/?GOOS=windows#NewCallbackCDecl) は、複数のサブ `uintptr` サイズの引数が一列に並んだコールバック関数を正しくサポートするようになりました. これにより、小さな引数間の手動のパディングを削除するために、これらの関数の使用法を変更する必要があるかもしれません.

Windows の [`SysProcAttr`](https://golang.org/pkg/syscall/?GOOS=windows#SysProcAttr) が新しいプロセスの作成時にハンドルの継承を無効にする `NoInheritHandles` を持つようになりました.

Windows の [`DLLError`](https://golang.org/pkg/syscall/?GOOS=windows#DLLError) は基礎となるエラーをアンラップするための `Unwrap` メソッドを持つようになりました.

Linux で、[`Setgid`](https://golang.org/pkg/syscall/#Setgid)、[`Setuid`](https://golang.org/pkg/syscall/#Setuid)、および関連する呼び出しが実装されました. 以前、それらは `syscall.EOPNOTSUPP` エラーを返していました.

Linux では、新しい [`AllThreadsSyscall`](https://golang.org/pkg/syscall/#AllThreadsSyscall) と [`AllThreadsSyscall6`](https://golang.org/pkg/syscall/#AllThreadsSyscall6) 関数を、プロセス内のすべての Go スレッドに対してシステムコールを行うことに使用できます. これらの関数は、cgo を使用していないプログラムでのみ使用でき、もしプログラムが cgo を使用していたら、それらは常に [`syscall.ENOTSUP`](https://golang.org/pkg/syscall/#ENOTSUP) を返します.

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

新しい [`ErrReader`](https://golang.org/pkg/testing/iotest/#ErrReader) 関数は常にエラーを返す [`io.Reader`](https://golang.org/pkg/io/#Reader) を返します.

新しい [`TestReader`](https://golang.org/pkg/testing/iotest/#TestReader) 関数は [`io.Reader`](https://golang.org/pkg/io/#Reader) が正しく振る舞うかをテストします.

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

アクションの区切り文字の中で改行が許されるようになり、複数の行にまたがるアクションが許されるようになりました.

新しい [`template.ParseFS`](https://golang.org/pkg/text/template/#ParseFS) 関数と [`template.Template.ParseFS`](https://golang.org/pkg/text/template/#Template.ParseFS) メソッドは [`template.ParseGlob`](https://golang.org/pkg/text/template/#ParseGlob) と [`template.Template.ParseGlob`](https://golang.org/pkg/text/template/#Template.ParseGlob) のようなものですが、[`fs.FS`](https://golang.org/pkg/io/fs/#FS) からテンプレートを読みます.

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

パースツリーに新しく [`CommentNode`](https://golang.org/pkg/text/template/parse/#CommentNode) が追加されました. `parse.Tree` の中の [`Mode`](https://golang.org/pkg/text/template/parse/#Mode) フィールドがそれにアクセスすることを可能にしました.

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

タイムゾーンデータベースとして、`$GOROOT/lib/time/zoneinfo.zip` とこのパッケージ内の埋め込みコピーでスリムタイムゾーンデータ形式が使われるようになりました. これにより、タイムゾーンデータベースのサイズが約350KB削減されました.

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

[`unicode`](https://golang.org/pkg/unicode/) パッケージとシステム全体の関連するサポートは、Unicode 12.0.0 から、5,930の新しい文字と、4つの新しいスクリプトと、55の新しい絵文字が追加された、[Unicode 13.0.0](https://www.unicode.org/versions/Unicode13.0.0/) にアップグレードされました. また、Unicode 13.0.0 では第三漢字面として第三面(U+30000-U+3FFFF)を指定しています.