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

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

# Go 1.15 の紹介

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

Go 1.15 には、[リンカの大幅な改良](#linker)、[多 CPU コア数での小さなオブジェクトの割り当て](#runtime)の改善、[X.509 CommonName](#commonname) の廃止が含まれています. `GOPROXY` はエラーを返すプロキシのスキップをサポートし、新しい[埋め込み tzdata パッケージ](#time/tzdata)が追加されました。

# 言語への変更

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

# ポート

## Darwin

Go 1.14 のリリースノートで[アナウンス](https://golang.org/doc/go1.14#darwin)したように、Go 1.15 は macOS 10.12 Sierra 以降を必要とし、以前のバージョンのサポートは終了となります.

Go 1.14 のリリースノートで[アナウンス](https://golang.org/doc/go1.14#darwin)したように、Go 1.15 は macOS、iOS、iPadOS, watchOS、tvOS 上の32ビットバイナリ(`darwin/386` と `darwin/arm` のポート)のサポートを終了します. Go は64ビットの `darwin/amd64` と `darwin/arm64` のサポートは継続します.

## Windows

Go は `-buildmode=pie` cmd/link フラグが指定されたときに Windows ASLR 実行ファイルを生成するようになりました, Windows では、Go コマンドはデフォルトで `-buildmode=pie` を使用します.

`-race` と `-msan` フラグは、`unsafe.Pointer` の使用をチェックする `-d=checkptr` を常に有効とするようになりました. これは以前から Windows を除く全ての OS でそうでした.

Go で作られた DLL は、シグナル(ターミナルでの Ctrl-C など)を受け取ったときにプロセスを終了させないようになりました.

## Android

Android 用のバイナリをリンクする際に、Go 1.15 は最近のバージョンの NDK で利用可能な `lld` リンカを明示的に選択します. `lld` リンカは一部のデバイスでのクラッシュを回避し、将来の NDK バージョンではデフォルトのNDK リンカになる予定です.

## OpenBSD

Go 1.15 は `GOARCH=arm` と `GOARCH=arm64` での OpenBSD 6.7 のサポートを追加します. 以前のバージョンの Go では、すでに `GOARCH=386` と `GOARCH=amd64` での OpenBSD 6.7 をサポートしています.

## RISC-V

Linux 上の 64 ビット RISC-V ポート(`GOOS=linux`, `GOARCH=riscv64`)の安定性と性能の向上に進展がありました. また、非同期のプリエンプションもサポートするようになりました.

## 386

Go 1.15 は x87 浮動小数点数のみを持つハードウェア(`GO386=387`)をサポートする最後のリリースとなります. 今後のリリースでは 386 では少なくとも SSE2 をサポートすることが要求されるようになり、Go の `GOARCH=386` の最小要件は Intel Pentium 4 (2000年リリース) または AMD Opteron/Athlon 64 (2003年リリース) に引き上げられます.

# ツール

## Go コマンド

`GOPROXY` 環境変数はエラーを返すプロキシのスキップをサポートしました. プロキシ URL はカンマ (`,`) かパイプ文字 (`|`) で区切ることができるようになりました. もしプロキシ URL がカンマに続いている場合、`go` コマンドは 404 か 410 HTTP レスポンスの場合にのみリストの次のプロキシを試します. もしプロキシ URL がパイプ文字に続いている場合、`go` コマンドはどんなエラーでもリストの次のプロキシを試します. `GOPROXY` のデフォルト値は、エラーのときに `direct` にフォールバックしない `https://proxy.golang.org,direct` のままであることに注意してください.

### `go test`

`-timeout` フラグの変更がキャッシュされたテスト結果を無効化するようになりました. 長いタイムアウトで実行したテストの結果のキャッシュが、短いタイムアウトで `go test` を再実行した時にパスとしてカウントされることはもう有りません.

### フラグ解析

`go test` と `go vet` の様々なフラグ解析の問題が修正されました. 特に `GOFLAGS` の中で指定されたフラグはより一貫性があるように扱われるようになり、`-outputdir` フラグは (個々のテストの作業ディレクトリではなく) `go` コマンドの作業ディレクトリと解釈されるようになりました.

### モジュールキャッシュ

モジュールキャッシュの場所は `GOMODCACHE` 環境変数で設定できるようになりました. `GOMODCACHE` のデフォルト値は、この変更が入る前からモジュールがキャッシュされていた場所である `GOPATH[0]/pkg/mod` です.

外部プログラムがファイルシステムを同時にスキャンすることで発生する、モジュールキャッシュにアクセスする `go` コマンドで "Access is denied" エラーが発生する Windows 向けのワークアラウンドが利用可能になりました([issue #36568](https://golang.org/issue/36568)を見てください). 1.14.2 及び 1.13.10 未満の Go バージョンが同じモジュールキャッシュで同時に実行される時に使用すると安全ではないため、このワークアラウンドはデフォルトでは有効となっていません. 環境変数に `GODEBUG=modcacheunzipinplace=1` を明示的に設定することにより、有効にできます.

## Vet

### string(x) への新しい警告

vet ツールは，`x` が `rune` もしくは `byte` 以外の整数型を持つ `string(x)` 形式の変換について警告するようになりました. Go での経験から、この形式の変換の多くは、`string(x)` が整数 `x` の文字列表現に評価されると誤って想定していることが分かっています. 実際には、`x` の値の UTF-8 エンコーディングを含む文字列として評価されます. 例えば、`string(9786)` は文字列 `"9786"` に評価されるのではなく、文字列 `"\xe2\x98\xba"` もしくは `"☺"` に評価されます。

`string(x)` を正しく使用しているコードは、`string(rune(x))` に書き換えることが可能です. あるいは、いくつかのケースでは、適切なバイトスライス `buf` で `utf8.EncodeRune(buf, x)` を呼び出すことが正しい解決策かもしれません. 他のコードでは `strconv.Itoa` や `fmt.Sprint` を使用しなければならないでしょう.

この新しい vet チェックは、`go test` を使用するときにデフォルトで有効になっています.

私たちは、Go の将来のリリースでこの変換を禁止することを検討しています. つまり、`x` の型が `rune` か `byte` である整数 `x` に対してのみ `string(x)` が許されるように言語が変更されます. そのような言語の変更は後方互換性がありません. 私達は言語を変更するための最初の試験的なステップとして、この vet チェックを使用しています.

### 不可能なインターフェース変換への新しい警告

あるインターフェイス型から別のインターフェイス型への常に失敗する型アサーションについて、vet ツールは警告するようになりました. これは両方のインターフェース型が違う型シグネチャの同じ名前のメソッドを実装している場合に発生します.

常に失敗する型アサーションを書く理由はないので、この vet チェックを引き起こすコードはすべて書き換えるべきです.

この新しい vet チェックは、`go test` を使用するときにデフォルトで有効になっています.

Go の将来のリリースでは、不可能なインターフェイスの型アサーションを禁止することを検討しています. そのような言語の変更は後方互換性がありません. 私達は言語を変更するための最初の試験的なステップとして、この vet チェックを使用しています.

# ランタイム

`bool`, `complex64`, `complex128`, `float32`, `float64`, `int`, `int8`, `int16`, `int32`, `int64`, `string`, `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `uintptr` の派生型の値で `panic` を発生させた場合、そのアドレスの代わりに値が表示されるようになりました. 以前は正確にこれらの型の値の場合にのみ値が表示されていました.

Unix システム上で、`kill` コマンドまたは `kill` システムコールが `SIGSEGV`、`SIGBUS`、`SIGFPE` シグナルを Go プログラムに送信するために使用され、そのシグナルが [`os/signal.Notify`](https://golang.org/pkg/os/signal/#Notify) でハンドルされていない場合、Go プログラムは確実にスタックトレース有りでクラッシュするようになりました. 以前のリリースでは、挙動が予測不可能でした.

スモールオブジェクトの割り当ては、コア数が多い場合のパフォーマンスがずっと良くなり、ワーストケースのレイテンシもより低くなりました.

小さな整数値をインターフェイス値に変換してもアロケーションが発生しなくなりました.

閉じたチャンネルでのノンブロッキング受信が、開いているチャンネルでのノンブロッキング受信と同じ動作をするようになりました.

# コンパイラ

パッケージ `unsafe` の [安全規則](https://golang.org/pkg/unsafe/#Pointer) は特定の関数を呼び出す際に `unsafe.Pointer` を `uintptr` に変換することを許しています. 以前は、いくつかのケースで、コンパイラは複数の連鎖変換を許可していました(例えば、`syscall.Syscall(…, uintptr(uintptr(ptr)), …)`). コンパイラは今や正確に1つの変換であることを求めます. 複数の変換を使用していたコードは、安全規則を満たすように更新する必要があります.

Go 1.15 では、特定のタイプの GC メタデータを削除し、未使用の型メタデータをより積極的に削除することで、典型的なバイナリサイズを Go 1.14 と比較して約5%削減しました.

ツールチェーンは、関数を32バイト境界に揃え、ジャンプ命令をパディングすることによって、`GOARCH=amd64` 上で [Intel CPU erratum SKX102](https://www.intel.com/content/www/us/en/support/articles/000055650/processors.html) を緩和するようになりました. このパディングによりバイナリサイズが増加しますが、上述のバイナリサイズの改善により埋め合わせています.

Go 1.15 では、コンパイラとアセンブラの両方に `-spectre` フラグが追加され、Spectre の緩和が有効にできるようになりました. これらはほとんど必要ないはずですが、主に "defense in depth" メカニズムとして提供されています. 詳細については [Spectre wiki page](https://github.com/golang/go/wiki/Spectre) を参照してください。

コンパイラは、それらが適用される宣言にとって意味のない `//go:` コンパイラディレクティブを、"misplaced compiler directive" エラーとして拒否するようになりました. そのような誤って適用されたディレクティブは以前から壊れていましたが、コンパイラによって無言で無視されていました.

コンパイラの `-json` 最適化ロギングは、大きな (128バイト以上) コピーを報告するようになり、エスケープ解析の判断の説明を含むようになりました.

# リンカ

このリリースには、リンカのリソース使用量(時間とメモリの両方)を削減し、コードの堅牢性/保守性を向上させる、Go リンカへの大幅な改良が含まれています.

大規模な Go プログラムの代表的なセットでは、`amd64` アーキテクチャ上で動作する `ELF` ベースの OS (Linux, FreeBSD, NetBSD, OpenBSD, Dragonfly, および Solaris) の場合、リンクは 20% 高速化され、必要とするメモリは平均で 30% 少なくなり、他のアーキテクチャ/OSの組み合わせではもう少し控えめな改善となります.

リンカの性能向上の主要因は、新しく再設計されたオブジェクトファイル形式や、同時実行性を高めるための内部フェーズの見直しです(例えば、シンボルへの再配置を並行して適用する). Go 1.15 のオブジェクトファイルは、1.14 のものよりも若干大きくなっています.

これらの変更は [Go リンカの近代化](https://golang.org/s/better-linker) のためのマルチリリースプロジェクトの一部であり、将来のリリースではさらなるリンカの改良が期待できます.

リンカは `linux/amd64` と `linux/arm64` で内部リンクモードとして `-buildmode=pie` をデフォルトとしたので、これらの構成では C リンカを必要としなくなりました. 外部リンクモード(Go 1.14では `-buildmode=pie` がデフォルトでした)は、`-ldflags=-linkmode=external` フラグを使って引き続き要求することができます.

# Objdump

[objdump](https://golang.org/cmd/objdump/) ツールは `-gnu` フラグで、GNU アセンブラ構文での逆アセンブルをサポートするようになりました.

# コアライブラリ

## 新しい tzdata 埋め込みパッケージ

Go 1.15 には、タイムゾーンデータベースをプログラムに埋め込むことができる新しいパッケージ、[`time/tzdata`](https://golang.org/pkg/time/tzdata/) が含まれています. (`import _ "time/tzdata"` のように)このパッケージをインポートすると、ローカルシステム上にタイムゾーンデータベースがない場合でも、プログラムがタイムゾーン情報を見つけることができます. `-tags timetzdata` を付けてビルドすることによってでもタイムゾーンデータベースを埋め込むことができます. どちらのやり方でも、プログラムのサイズは約 800KB 増加します.

## Cgo

Go 1.15 では、C言語型の `EGLConfig` が Go 言語型の `uintptr` に変換されます. この変更は Go 1.12 以降の `EGLDisplay` や Darwin の CoreFoundation や Java の JNI 型の扱い方に似ています. 詳細は [cgo のドキュメント](https://golang.org/cmd/cgo/#hdr-Special_cases) を参照してください.

## X.509 CommonName の廃止

Subject Alternative Names が存在しない場合、X.509 証明書の `CommonName` フィールドをホスト名として扱うという非推奨でレガシーな挙動がデフォルトで無効になりました. `GODEBUG` 環境変数に `x509ignoreCN=0` の値を追加することで、一時的に再度有効にすることが可能です.

`GODEBUG` の設定に関わらず `CommonName` が無効なホスト名の場合、常に無視されることに注意してください. 無効な名前には英字、数字、ハイフン、アンダースコア以外の文字や空のラベルや末尾にドットがあるものが含まれます.

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

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

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

[`Scanner`](https://golang.org/pkg/bufio/#Scanner) が無効な [`io.Reader`](https://golang.org/pkg/io/#Reader) と一緒に使用され、`Read` から誤って負の数を返す場合、`Scanner` は panic にならず、代わりに新しいエラー [`ErrBadReadCount`](https://golang.org/pkg/bufio/#ErrBadReadCount) を返すようになります.

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

nil の親を使用して派生 `Context` を作成することが明示的に禁止されるようになりました. [`WithValue`](https://golang.org/pkg/context/#WithValue)、[`WithDeadline`](https://golang.org/pkg/context/#WithDeadline)、[`WithCancel`](https://golang.org/pkg/context/#WithCancel) 関数を使用してこれを行おうとすると、パニックを引き起こします.

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

[`crypto/rsa`](https://golang.org/pkg/crypto/rsa)、[`crypto/ecdsa`](https://golang.org/pkg/crypto/ecdsa)、[`crypto/ed25519`](https://golang.org/pkg/crypto/ed25519) パッケージの `PrivateKey`、`PublicKey` 型に鍵の等価性を比較したり、公開鍵の型安全インタフェースを作成するための `Equal` メソッドが追加されました. このメソッドのシグネチャは、[`go-cmp` の等価の定義](https://pkg.go.dev/github.com/google/go-cmp/cmp#Equal)と互換性があります.

[`Hash`](https://golang.org/pkg/crypto/#Hash) は [`fmt.Stringer`](https://golang.org/pkg/fmt/#Stringer) を実装しました.

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

新しい [`SignASN1`](https://golang.org/pkg/crypto/ecdsa/#SignASN1) 関数と [`VerifyASN1`](https://golang.org/pkg/crypto/ecdsa/#VerifyASN1) 関数は、標準 ASN.1 DER エンコーディングでECDSA 署名を生成し、検証することを可能にします.

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

新しい [`MarshalCompressed`](https://golang.org/pkg/crypto/elliptic/#MarshalCompressed) 関数と [`UnmarshalCompressed`](https://golang.org/pkg/crypto/elliptic/#UnmarshalCompressed) 関数は圧縮形式での NIST 楕円曲線点のエンコードとデコードを可能にします.

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

[`VerifyPKCS1v15`](https://golang.org/pkg/crypto/rsa/#VerifyPKCS1v15) は RFC 8017 に従って、先頭のゼロが欠落している無効な短い署名を拒否するようになりました.

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

新しい [`Dialer`](https://golang.org/pkg/crypto/tls/#Dialer) 型とその [`DialContext`](https://golang.org/pkg/crypto/tls/#Dialer.DialContext) メソッドにより、コンテキストを使用して TLS サーバとの接続とハンドシェイクの両方を行うことができます.

[`Config`](https://golang.org/pkg/crypto/tls/#Config) 型の新しい [`VerifyConnection`](https://golang.org/pkg/crypto/tls/#Config.VerifyConnection) コールバックにより、すべての接続に対してカスタム検証ロジックを適用することができます. このコールバックでは、ピア証明書、SCT、ステープルされた OCSP レスポンスを含む [`ConnectionState`](https://golang.org/pkg/crypto/tls/#ConnectionState) にアクセスすることができます.

自動生成されたセッションチケットの鍵は、forward secrecy への影響を制限するために、24時間ごとに自動的にローテーションされ、有効期限は7日間となりました.

接続の再開で再利用されるセッションキーである、TLS 1.2 およびそれ以前のバージョンのセッションチケットの寿命は forward secrecy への影響を制限するため、同様に7日に制限されました.

RFC 8446 で規定されているクライアント側のダウングレード保護チェックが実施されるようになりました. これにより、許可されていないダウングレード攻撃のような動作をするミドルボックスに遭遇したクライアントが接続エラーを起こす可能性があります。

[`SignatureScheme`](https://golang.org/pkg/crypto/tls/#SignatureScheme)、[`CurveID`](https://golang.org/pkg/crypto/tls/#CurveID)、[`ClientAuthType`](https://golang.org/pkg/crypto/tls/#ClientAuthType) が [`fmt.Stringer`](https://golang.org/pkg/fmt/#Stringer) を実装しました.

[`ConnectionState`](https://golang.org/pkg/crypto/tls/#ConnectionState) のフィールド `OCSPResponse` と `SignedCertificateTimestamps` がクライアント側の再開された接続で再設定されるようになりました.

[`tls.Conn`](https://golang.org/pkg/crypto/tls/#Conn) は、恒久的に壊れた接続に対して、一時的な [`net.Error`](https://golang.org/pkg/net/http/#Error) をラップした不明瞭なエラーを返すようになりました. もとの `net.Error` にアクセスするのには、型アサーションではなく [`errors.As`](https://golang.org/pkg/errors/#As) (または [`errors.Unwrap`](https://golang.org/pkg/errors/#Unwrap)) を使います.

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

証明書上の名前または ([`VerifyOptions.DNSName`](https://golang.org/pkg/crypto/x509/#VerifyOptions.DNSName) や [`VerifyHostname`](https://golang.org/pkg/crypto/x509/#Certificate.VerifyHostname) で) 検証されている名前のいずれかが無効な場合、それ以上の処理なしに大文字小文字を区別せずに比較されます(ワイルドカードを無視したり、末尾のドットを除去したりすることはありません). 無効な名前には、英字、数字、ハイフン、アンダースコア以外の文字、空のラベルを持つ名前、証明書の名前で末尾にドットがあるものが含まれます.

新しい [`CreateRevocationList`](https://golang.org/pkg/crypto/x509/#CreateRevocationList) 関数と [`RevocationList`](https://golang.org/pkg/crypto/x509/#RevocationList) 型により、RFC 5280 準拠の X.509 v2 証明書失効リストを作成できるようになりました.

[`CreateCertificate`](https://golang.org/pkg/crypto/x509/#CreateCertificate) はテンプレートが CA で `SubjectKeyId` が明示的に指定されていない場合、自動で生成するようになりました.

[`CreateCertificate`](https://golang.org/pkg/crypto/x509/#CreateCertificate) は、テンプレートが `MaxPathLen` を指定しているが CA ではない場合に、エラーを返すようになりました.

macOS 以外の Unix システムで、`SSL_CERT_DIR` 環境変数をコロン区切りリストにできるようになりました.

macOS では、cgo が利用可能かどうかに関わらず、システムのトラストルートを取り出すために、バイナリは常に `Security.framework` に対してリンクされるようになりました. 結果として OS のベリファイアとより一貫した動作をするようになりました.

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

[`ExtraNames`](https://golang.org/pkg/crypto/x509/pkix/#Name.ExtraNames) が nil の場合、[`Name.String`](https://golang.org/pkg/crypto/x509/pkix/#Name.String) は [`Names`](https://golang.org/pkg/crypto/x509/pkix/#Name.Names) から非標準属性を表示するようになりました.

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

新しい [`DB.SetConnMaxIdleTime`](https://golang.org/pkg/database/sql/#DB.SetConnMaxIdleTime) メソッドは、コネクションが一定期間アイドル状態になった後に、コネクションの総ライフスパンに関係なくコネクションプールからコネクションを削除することができます. [`DBStats.MaxIdleTimeClosed`](https://golang.org/pkg/database/sql/#DBStats.MaxIdleTimeClosed) フィールドは `DB.SetConnMaxIdleTime` によってクローズされた接続の総数を示します.

新しい [`Row.Err`](https://golang.org/pkg/database/sql/#Row.Err) ゲッターにより、`Row.Scan` を呼ばずにクエリエラーをチェックできるようになりました.

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

新しい [`Validator`](https://golang.org/pkg/database/sql/driver/#Validator) インターフェイスは `Conn` によって実装され、接続が有効かどうか、または破棄すべきかどうかをドライバがシグナルすることができるようになります.

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

PE ファイル形式で使われる定数 `IMAGE_FILE`、`IMAGE_SUBSYSTEM`、`IMAGE_DLLCHARACTERISTICS` が定義されました.

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

[`Marshal`](https://golang.org/pkg/encoding/asn1/#Marshal) は X.690 DER に従って SET OF の構成要素をソートするようになりました.

[`Unmarshal`](https://golang.org/pkg/encoding/asn1/#Unmarshal) は、X.690 DER に従って最小エンコードされていないタグとオブジェクト識別子を拒否するようになりました.

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

デコード時のネスティングの最大の深さに内部的な制限を持つようになりました. これにより、深くネストされた入力が大量のスタックメモリを使用したり、"goroutine stack exceeds limit" パニックが発生したりする可能性が減りました.

[`Unmarshal`](https://golang.org/pkg/encoding/json/#Unmarshal) は、[`encoding.TextUnmarshaler`](https://golang.org/pkg/encoding/#TextUnmarshaler) を実装した文字列型のマップキーをサポートするようになりました

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

`flag` パッケージが `-h` や `-help` を見て、それらのフラグが定義されていない場合、使用状況のメッセージを表示するようになりました. [`FlagSet`](https://golang.org/pkg/flag/#FlagSet) が [`ExitOnError`](https://golang.org/pkg/flag/#ExitOnError) で作成された場合、[`FlagSet.Parse`](https://golang.org/pkg/flag/#FlagSet.Parse) はステータス 2 で終了します. このリリースでは、`-h` や `-help` の終了ステータスが 0 に変更されました. 特にこれはコマンドラインフラグのデフォルト処理に適用されます.

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

表示動詞 `%#g` と `%#G` は、浮動小数点値の末尾のゼロを維持するようになりました.

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

[`Source`](https://golang.org/pkg/go/format/#Source) 関数と [`Node`](https://golang.org/pkg/go/format/#Node) 関数は、Goソースコードのフォーマットの一部として、数値リテラルの接頭辞と指数を正規化するようになりました. これは、[Go 1.13 以降](https://golang.org/doc/go1.13#gofmt)に実装された [`gofmt`](https://golang.org/pkg/cmd/gofmt/) コマンドの動作と一致しています.

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

すべての JavaScript と JSON のコンテキストで Unicode エスケープ (`\uNNNN`) を使用するようになりました. これにより  `application/ld+json` と `application/json` のコンテキストでのエスケープエラーが修正されました.

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

[`TempDir`](https://golang.org/pkg/io/ioutil/#TempDir) と [`TempFile`](https://golang.org/pkg/io/ioutil/#TempFile) はパス区切り文字を含むパターンを拒否するようになりました. つまり、`ioutil.TempFile("/tmp",` `"../base*")` のような呼び出しは成功しなくなりました. これにより、意図しないディレクトリトラバーサルを防ぐことができます.

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

新しい [`Int.FillBytes`](https://golang.org/pkg/math/big/#Int.FillBytes) メソッドにより固定サイズのあらかじめ割り当てられたバイトスライスにシリアライズすることができるようになりました.

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

本パッケージの関数は、無限大、NaN、符号付きゼロなどの特殊な引数の取り扱いに関して、C99 標準(Annex G IEC 60559 互換複素数演算)に準拠するように更新されました.

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

I/O 操作が [`Conn.SetDeadline`](https://golang.org/pkg/net/#Conn) メソッド、`Conn.SetReadDeadline` メソッド、`Conn.SetWriteDeadline` メソッドによって設定されたデッドラインを超えると、[`os.ErrDeadlineExceeded`](https://golang.org/pkg/os#ErrDeadlineExceeded) をラップしたエラーを返すようになりました. これによりエラーが期限を超えたことによるものかどうかを確実に検出することができます. 以前のリリースでは、エラーが発生した際に `Timeout` メソッドを呼び出すことを推奨していましたが、 期限を超えていないにもかかわらず `Timeout` が `true` を返すエラーをI/O 操作が返すことがあります.

新しい [`Resolver.LookupIP`](https://golang.org/pkg/net/#Resolver.LookupIP) メソッドは、ネットワーク固有の IP ルックアップとコンテキストを受け入れる IP ルックアップの両方をサポートしています.

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

HTTP Request Smuggling 攻撃が難しくなるようにパースがより厳格になりました. SP や HTAB のように非 ASCII ホワイトスペースはトリムされなくなり、"`identity`" `Transfer-Encoding` のサポートが削除されました.

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

[`ReverseProxy`](https://golang.org/pkg/net/http/httputil/#ReverseProxy) は、入ってくる `Request.Header` マップエントリの `X-Forwarded-For` フィールドを `nil` とすることによって、`X-Forwarded-For` を変更しないことをサポートするようになりました.

[`ReverseProxy`](https://golang.org/pkg/net/http/httputil/#ReverseProxy) によってハンドルされた Switching Protocol (WebSocket のような) リクエストがキャンセルされた場合、バックエンド接続が正しく閉じられるようになりました.

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

すべてのプロファイルエンドポイントが "`seconds`" パラメータをサポートするようになりました. 与えられた場合、エンドポイントは指定された秒数分のプロファイルを行い、その差分をレポートします. `cpu` プロファイルとトレースエンドポイントの "`seconds`" パラメータの意味は変更されていません.

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

新しい [`URL`](https://golang.org/pkg/net/url/#URL) フィールド `RawFragment` とメソッド [`EscapedFragment`](https://golang.org/pkg/net/url/#URL.EscapedFragment) は、特定のフラグメントの正確なエンコーディングについての詳細と制御を提供します. これらは `RawPath` と [`EscapedPath`](https://golang.org/pkg/net/url/#URL.EscapedPath) に類似しています.

新しい [`URL`](https://golang.org/pkg/net/url/#URL) のメソッド [`Redacted`](https://golang.org/pkg/net/url/#URL.Redacted) は、どのパスワードも `xxxxx` に置き換えた文字列形式の URL を返します.

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

I/O 操作が [`File.SetDeadline`](https://golang.org/pkg/os/#File.SetDeadline) メソッド、[`File.SetReadDeadline`](https://golang.org/pkg/os/#File.SetReadDeadline) メソッド、[`File.SetWriteDeadline`](https://golang.org/pkg/os/#File.SetWriteDeadline) メソッドによって設定されたデッドラインを超えると、[`os.ErrDeadlineExceeded`](https://golang.org/pkg/os#ErrDeadlineExceeded) をラップしたエラーを返すようになりました. これによりエラーが期限を超えたことによるものかどうかを確実に検出することができます. 以前のリリースでは、エラーが発生した際に `Timeout` メソッドを呼び出すことを推奨していましたが、 期限を超えていないにもかかわらず `Timeout` が `true` を返すエラーをI/O 操作が返すことがあります.

パッケージ `os` と `net` は、`EINTR` で失敗したシステムコールを自動的に再試行するようになりました. 以前はこれが原因で偽のエラーが発生していましたが、Go 1.14 では非同期の先取り機能が追加されたことで、より一般的になりました. これが今や透過的に処理されるようになりました.

[`os.File`](https://golang.org/pkg/os/#File) 型が [`ReadFrom`](https://golang.org/pkg/os/#File.ReadFrom) メソッドをサポートするようになりました. これにより、ある `os.File` から別の `os.File` にデータをコピーするために [`io.Copy`](https://golang.org/pkg/io/#Copy) を使用する際に、一部のシステムで `copy_file_range` システムコールを使用できるようになりました. 結果として、[`io.CopyBuffer`](https://golang.org/pkg/io/#CopyBuffer) は `os.File` にコピーするときに提供されたバッファを常に使用するとは限りません. プログラムが提供されたバッファを強制的に使用したい場合は、`io.CopyBuffer(struct{ io.Writer }{dst}, src, buf)` と書くことによって可能です.

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

macOS 上の `-buildmode=plugin` で DWARF の生成がサポートされました(デフォルトで有効になっています).

`freebsd/amd64` で `-buildmode=plugin` でのビルドがサポートされました.

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

パッケージ `reflect` は、以前はエクスポートされていない埋め込みフィールドへのアクセスを許可していましたが、エクスポートされていないすべてのフィールドのメソッドへのアクセスを禁止するようになりました. 以前の動作に依存しているコードは、代わりに取り囲む変数に対応する昇格メソッドにアクセスするように更新する必要があります.

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

新しい [`Regexp.SubexpIndex`](https://golang.org/pkg/regexp/#Regexp.SubexpIndex) メソッドは、正規表現内で指定された名前の最初のサブ式のインデックスを返します.

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

[`ReadMemStats`](https://golang.org/pkg/runtime/#ReadMemStats) と [`GoroutineProfile`](https://golang.org/pkg/runtime/#GoroutineProfile) を含むいくつかの関数は、ガベージコレクションが進行中であってもブロックしなくなりました.

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

goroutine プロファイルはプロファイリング時に各 goroutine に関連付けられたプロファイルラベルを含むようになりました. この機能は `debug=2` で報告されるプロファイルにはまだ実装されていません.

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

複素数を扱うための [`FormatComplex`](https://golang.org/pkg/strconv/#FormatComplex) と [`ParseComplex`](https://golang.org/pkg/strconv/#ParseComplex) が追加されました.

[`FormatComplex`](https://golang.org/pkg/strconv/#FormatComplex) は、複素数を a と b を実数と虚数のパートとする (a+bi) 形式の文字列に変換します.

[`ParseComplex`](https://golang.org/pkg/strconv/#ParseComplex) は文字列を指定した精度の複素数に変換します. `ParseComplex` は、`N+Ni` の形式の複素数を受け付けます.

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

新しいメソッド [`Map.LoadAndDelete`](https://golang.org/pkg/sync/#Map.LoadAndDelete) は、アトミックにキーを削除し、存在する場合は前の値を返します。

[`Map.Delete`](https://golang.org/pkg/sync/#Map.Delete) メソッドはより効率的になりました.

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

Unix システムでは、[`SysProcAttr`](https://golang.org/pkg/syscall/#SysProcAttr) を使用する関数は、どちらも `Ctty` フィールドを使用していますが、互換性のない方法で使用しているので、`Setctty` フィールドと `Foreground` フィールドの両方を設定しようとする試みを拒否するようになりました. 既存のプログラムで両方のフィールドを設定することはほとんどないと想定しています.

`Setctty` フィールドを設定するには、`ProcAttr.Files` フィールドによって決定されるように、`Ctty` フィールドを子プロセスのファイル記述子番号に設定する必要があります. 子ディスクリプタを使用すると常に動作しますが、親ファイルディスクリプタを使用するとたまたま動作する場合がありました. `Setctty` を設定するプログラムの中には、子ディスクリプタ番号を使用するために `Ctty` の値を変更する必要があるものがあります.

`windows/amd64` で浮動小数点数の値を返すシステムコールを呼び出すことが[できるように](https://golang.org/pkg/syscall/#Proc.Call)なりました.

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

`testing.T`型にテストバイナリがタイムアウトを超過した時間を報告するための[`Deadline`](https://golang.org/pkg/testing/#T.Deadline)メソッドが追加されました.

`TestMain`関数は`os.Exit`を呼び出す必要がなくなりました. `TestMain`関数から戻ったとき、テストバイナリは`m.Run`によって返された値を使って`os.Exit`を呼び出します.

新しいメソッド[`T.TempDir`](https://golang.org/pkg/testing/#T.TempDir)と[`B.TempDir`](https://golang.org/pkg/testing/#B.TempDir)は、テスト終了時に自動的にクリーンアップされる一時ディレクトリを返します.

`go test -v` テスト名を各行に表示するのではなく、テスト名によって出力をグループ化するようになりました.

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

[`JSEscape`](https://golang.org/pkg/text/template/#JSEscape) は JSON と互換性のある Unicode エスケープ (`\u00XX`) を一貫して使うようになりました.

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

新しいメソッド[`Ticker.Reset`](https://golang.org/pkg/time/#Ticker.Reset)はティッカーの期間の変更をサポートしています。

エラーを返すときに、[`ParseDuration`](https://golang.org/pkg/time/#ParseDuration)が元の値を引用するようになりました.