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

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

# Go 1.12 の紹介

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

# 言語への変更

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

# ポート

競合検出器(race detector)が `linux/arm64` でサポートされました.

Go 1.12 はすでに EoL になっている FreeBSD 10.x をサポートする最後のリリースです. Go 1.13 では FreeBSD 11.2 以降または FreeBSD 12.0 以降が必要になります. FreeBSD 12.0 以降では COMPAT_FREEBSD11 オプションセットが有効(デフォルト状態です)なカーネルが必要です.

cgo が `linux/ppc64` でサポートされました.

hurd は今は gccgoで使用するために GNU/Hurd システム用に予約されている、GOOS のための認識された値です.

## Windows

Go の新しい `windows/arm` ポートは、Raspberry Pi 3 などの 32ビットARMチップ上の Windows 10 IoT Core で Go の動作をサポートします.

## AIX

Go は、POWER8アーキテクチャー(`aix/ppc64`)上で AIX 7.2 以降をサポートしました. 外部リンク、cgo、pprof、および競合検出器(race detector)はまだサポートしていません.

## Darwin

Go 1.12 は macOS 10.10 Yosemite で動く最後のリリースです. Go 1.13 では macOS 10.11 El Capitan 以降が必要になります.

`libSystem` は、Darwin でシステムコールを作成するときに使用されるようになり、macOS と iOS の将来のバージョンの前方互換性を保証します. `libSystem` への切り替えにより、App Store でプライベート API の使用がさらにチェックされます. 非公開と見なされるため、`syscall.Getdirentries` は iOS 上において `ENOSYS` で常に失敗します. さらに、[`syscall.Setrlimit`](https://golang.org/pkg/syscall/#Setrlimit) は過去成功した場面でも `invalid argument` を報告します. これらの結果は Go に特有のものではなく、ユーザは今後も挙動が `libSystem` の実装と同等であることを期待すべきです.

# ツール

## `go tool vet` は最早サポートされません

`go vet` コマンドは、さまざまなソースコード解析ツールのベースとして機能するように書き直されました. 詳細は[golang.org/x/tools/go/analysis](https://godoc.org/golang.org/x/tools/go/analysis) パッケージを参照してください. 副作用で `go tool vet` がサポートされなくなりました. `go tool vet` を使用する外部ツールは `go vet` を使用するように変更しなければなりません. `go tool vet` の代わりに `go vet` を使えば、全てのサポートが切れていないバージョンの Go で動作するはずです.

この変更の一環として、実験的な `-shadow` オプションは `go vet` で使用できなくなりました. 変数シャドーイングのチェックは、以下で行えます.

```
go get -u golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
go vet -vettool=$(which shadow)
```

## Tour

Go tour はメインバイナリ配布物にもう含まれません. tour をローカルで実行するためには、`go tool tour`を実行する代わりに、手動インストールしてください:

```
go get -u golang.org/x/tour
tour
```

## ビルドキャッシュの要件

[ビルドキャッシュ](https://golang.org/cmd/go/#hdr-Build_and_test_caching)は `$GOPATH/pkg` を取り除くためのステップとして必要です. 環境変数に `GOCACHE=off` を設定すると、キャッシュに書き込む `go` コマンドが失敗します.

## バイナリオンリーパッケージ

Go 1.12 はバイナリオンリーパッケージをサポートする最後のリリースです.

## Cgo

Go 1.12 は C 言語の型 `EGLDisplay` を Go 言語の型 `uintptr` に変換するようになりました. Go 1.10 以降が Darwin の CoreFoundation と Java の JNI 型をどのように扱うかと、この変更は似ています. 詳しくは [cgo のドキュメント](https://golang.org/cmd/cgo/#hdr-Special_cases)を参照してください.

マングル化されている C の名前は Cgo を使っているパッケージの中では受け入れられなくなりました. 代わりに Cgo の名前を使用してください. 例えば、cgo が生成するマングル化された名前 `_Ctype_char` ではなく、文書化された cgo 名 `C.char` を使用します.

## モジュール

`GO111MODULE` が `on` に設定されている場合、操作が現在のディレクトリに対する相対的なインポートパスを解決する必要があったり、`go.mod` ファイルを明示的に編集したりする必要がない限り、`go` コマンドはモジュールディレクトリの外でモジュールを認識した操作をサポートするようになりました. `go get`、`go list`、`go mod download` などのコマンドは、初期の空の要件を持つモジュール内にあるかのように動作します. このモードでは、`go env` GOMOD はシステムのnull デバイス (`/dev/null` または `NUL`) を報告します.

モジュールをダウンロードして抽出する `go` コマンドは、複数同時に起動しても安全になりました. モジュールキャッシュ (`GOPATH/pkg/mod`) はファイルロックをサポートするファイルシステムに存在する必要があります.

`go.mod` ファイルの `go` ディレクティブは、そのモジュール内のファイルで使用されている言語のバージョンを示します. 既存のバージョンが存在しない場合は、現在のリリース(`go 1.12`)に設定されます. モジュールの `go` ディレクティブが使用中のツールチェーンよりも新しいバージョンを指定している場合、`go` コマンドはそれに関わらずパッケージの構築を試み、失敗した場合にのみ不一致を示します.

`go` ディレクティブのこの変更された使用法は、もしあなたがモジュールのビルドに Go 1.12 を使用し、`go.mod` ファイルに `go 1.12` を記録したならば、おなじモジュールを Go 1.11 から 1.11.3 でビルドしようとするとエラーが発生することを意味します. Go 1.14 以降で問題なく動作するのであれば、Go 1.11 より古いものでも問題なく動作するでしょう. もしあなたが Go 1.11 から 1.11.3 を使わなければならないなら、Go 1.12 の go tool を使い、`go mod edit -go=1.11` で言語バージョンを 1.11 に設定することよって問題を回避できます.

アクティブなモジュールを使ってインポートを解決できない場合、`go` コマンドはモジュールキャッシュと通常のネットワークソースを調べる前に、メインモジュールの `replace` ディレクティブに記載されているモジュールを使おうとするようになりました. 一致する置換が見つかったが `replace` ディレクティブがバージョンを指定していない場合、`go` コマンドはゼロ `time.Time` (`v0.0.0-00010101000000-000000000000` など) から派生した疑似バージョンを使用します.

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

コンパイラの変数の生死解析が改善されました. このことは以前のリリースよりもこのリリースで、ファイナライザがより早く実行されうることを意味します. もしそれが問題であれば、[runtime.KeepAlive](https://golang.org/pkg/runtime/#KeepAlive) の呼び出しを適切に追加することを検討してください.

他の関数を呼び出す以外に何もしない関数を含め、より多くの関数がデフォルトでインライン化の対象になりました. この追加のインライン化により、直接 [runtime.Callers](https://golang.org/pkg/runtime/#Callers) の結果を反復する代わりに、[runtime.CallersFrames](https://golang.org/pkg/runtime/#CallersFrames) を使用することがより重要になります.

```go
// 最早正しく動かない古いコード (インライン化されたコールフレームを見逃す).
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
for _, pc := range pcs[:n] {
	f := runtime.FuncForPC(pc)
	if f != nil {
		fmt.Println(f.Name())
	}
}

// 正しく動く新しいコード.
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
frames := runtime.CallersFrames(pcs[:n])
for {
	frame, more := frames.Next()
	fmt.Println(frame.Function)
	if !more {
		break
	}
}
```

メソッド式を実装するためにコンパイラによって生成されたラッパーは、[`runtime.CallersFrames`](https://golang.org/pkg/runtime/#CallersFrames)および[`runtime.Stack`](https://golang.org/pkg/runtime/#Stack)では報告されなくなりました. それらはパニックスタックトレースにも表示されません.
これは、すでにスタックトレースからそのようなラッパーを取り除いた gccgo ツールチェーンと一致するよう gc ツールチェーンを変更するものです.
これらの API のクライアントは、失われたフレームを調整する必要があるかもしれません. 1.11 と 1.12 の間で相互運用する必要があるコードの場合、メソッド式 `x.M` を関数リテラル `func（...）{ x.M(...）}` に置き換えることができます.

コンパイラは、使用する Go 言語のバージョンを設定するための `-lang` フラグを受け入れるようになりました. たとえば、`-lang=go1.8` を指定して、Go 1.9 で追加されたタイプエイリアスをプログラムで使用すると、コンパイルエラーになります. Go 1.12 以前に行われた言語の変更は、一貫して強制されていません.

コンパイラツールチェーンは、Go 関数とアセンブリ関数を呼び出しに異なるコンベンションを使うようになりました. Go とアセンブリの間およびパッケージの境界をまたぐ呼び出しを除いて、これはユーザーには見えないはずです. リンクの結果、 "relocation target not defined for ABIInternal (but is defined for ABI0)" のようなエラーが発生した場合には、ABI 設計ドキュメントの[互換性セクション](https://github.com/golang/proposal/blob/master/design/27539-internal-abi.md#compatibility)を参照してください.

引数の表示や変数の位置情報の改善などを含め、コンパイラによって生成される DWARF デバッグ情報に多くの改善が行われました.

`perf` のようなプロファイリングツールの利点のために、`linux/arm64` 上のスタックフレームポインタも、Go プログラムは維持するようになりました. フレームポインタの維持には、実行時のオーバーヘッドがわずかにありますが、平均 3% 程度です. フレームポインタを使用しないツールチェーンを構築するには、`make.bash` を実行するときに`GOEXPERIMENT=noframepointer` を設定します.

旧式の "safe" コンパイラモード(`-u gcflag` で有効にできる)は削除されました.

## `godoc` と `go doc`

Go 1.12 では、`godoc` はもはやコマンドラインインターフェースを持っておらず、Web サーバーのみです. ユーザは代わりとして、コマンドラインヘルプの出力に `go doc` を使うべきです. Go 1.12 は `godoc` Web サーバーを含む最後のリリースです. Go 1.13 では、`go get` を介して利用するようになる予定です.

`godoc` コマンドラインがそうしていたように、全てのエクスポートされた API とそのドキュメントが出力される、`-all` フラグを `go doc` はサポートするようになりました.

また、`go doc` は対象のソースコードを表示する `-src` フラグを持つようになりました.

## トレース

トレースツールは、実行トレースへの相互参照を含む、ミューテーター利用率曲線のプロットをサポートしました. アプリケーションのレイテンシとスループットに対するガベージコレクタの影響を分析するのにこれらは有益です.

## アセンブラ

`arm64` では、OS がこのレジスタを予約する可能性があるため、誤って使用されないように、プラットフォームレジスタは `R18` から `R18_PLATFORM` にリネームされました.

# ランタイム

Go 1.12 はヒープの大部分が生存のままであるときのスイープのパフォーマンスが大幅に改善しています. これはガベージコレクション直後のメモリ割り当てのレイテンシを削減します.

特に既存のヒープ領域を再利用できない大きな割り当てに対して、Go ランタイムはメモリをより積極的にオペレーティングシステムに返却するようになりました.

Go ランタイムのタイマーとデッドラインコードはより多い CPU 数でより高速に、よりスケールするようになりました. 特にネットワーク接続のデッドラインの操作のパフォーマンスが改善しています.

Linux で、ランタイムは未使用のメモリの解放に `MADV_FREE` を使用するようになりました. これはより効率的ですが、報告される RSS が高くなる可能性があります. カーネルは未使用のデータが必要なときに回収します. Go 1.11 の挙動(`MADV_DONTNEED`)に戻すには、環境変数に `GODEBUG=madvdontneed=1` を設定します.

[GODEBUG](https://golang.org/doc/diagnostics.html#godebug) 環境変数に `cpu.extension=off` を追加すると、標準ライブラリとランタイムでのオプションの CPU 命令セット拡張で使用されるのが無効になりました. これは Windows ではまだサポートされていません.

Go 1.12では、大きなヒープ割り当てのオーバーカウントを修正することでメモリプロファイルの精度が向上しました.

Tracebacks、`runtime.Caller`、および`runtime.Callers`に、コンパイラ生成の初期化関数が含まれなくなりました. グローバル変数の初期化中にトレースバックを実行すると、`PKG.init.ializers`という名前の関数が表示されます.

# コアライブラリ

## TLS 1.3

Go 1.12 では、RFC 8446 で規定された TLS 1.3 のオプトインサポートを `crypto/tls` パッケージに追加しています. それは `GODEBUG` 環境変数に `tls13=1` を追加することで有効にできます. Go 1.13 ではデフォルトで有効になります.

TLS 1.3 でネゴシエートするには、[Config](https://golang.org/pkg/crypto/tls/#Config) で明示的に `MaxVersion` を設定せずに、環境変数に `GODEBUG=tls13=1` を設定して、あなたのプログラムを走らせてください.

[ConnectionState](https://golang.org/pkg/crypto/tls/#ConnectionState) の `TLSUnique` と再ネゴシエーションを除くすべての TLS 1.2 機能は TLS 1.3 で使用可能であり、同等以上のセキュリティとパフォーマンスを提供します. TLS 1.3 は以前のバージョンと後方互換性がありますが、それをネゴシエートしようとするとある種のレガシシステムは正しく動作しない可能性があることに留意してください. 安全には程遠い小さすぎるRSA証明書鍵(512ビット鍵を含む)は TLS 1.3 では使えません.

TLS 1.3 暗号スイートは設定できません. サポートされているすべての暗号スイートは安全で、`PreferServerCipherSuites` が [Config](https://golang.org/pkg/crypto/tls/#Config) で設定されている場合、優先順位は利用可能なハードウェアに基づきます.

初期データ("0-RTTモード" とも呼ばれる)は、現在はクライアントとしてもサーバーとしてもサポートされていません. さらに Go 1.12 サーバーは、クライアントが送信した場合、予期しない初期データのスキップをサポートしていません. TLS 1.3 0-RTT モードでは、どのサーバーが 0-RTT をサポートしているかについてクライアントが状態を保持するので、Go 1.12 サーバーは他のサーバーが 0-RTT をサポートしているロードバランシングプールの一部にはなれません. 0-RTT をサポートするサーバーから Go 1.12 サーバーにドメインを切り替える場合、操作が中断されないことを保証するために、少なくとも切り替え前に発行されたセッションチケットの存続期間中 0-RTT を無効にする必要があります.

TLS 1.3 では、ハンドシェイクで最後に話すのはクライアントなので、サーバーでエラーが発生した場合、[ハンドシェイク](https://golang.org/pkg/crypto/tls/#Conn.Handshake)ではなく最初の[読み込み](https://golang.org/pkg/crypto/tls/#Conn.Read) でエラーがクライアントに返されます. たとえばサーバーがクライアント証明書を拒否したなどです. 同様にセッションチケットはハンドシェイク後のメッセージになり、クライアントは最初の[読み込み](https://golang.org/pkg/crypto/tls/#Conn.Read)時にのみ受信します.

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

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

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

[Peek](https://golang.org/pkg/bufio/#Reader.Peek) の後に呼び出された場合、Reader の [UnreadRune](https://golang.org/pkg/bufio/#Reader.UnreadRune) メソッドと [UnreadByte](https://golang.org/pkg/bufio/#Reader.UnreadByte) メソッドはエラーを返すようになりました.

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

新しい関数 [ReplaceAll](https://golang.org/pkg/bytes/#ReplaceAll) は、値の重複していないすべてのインスタンスを別のバイトスライスに置き換えて、バイトスライスのコピーを返します.

ゼロ値の [Reader](https://golang.org/pkg/bytes/#Reader) へのポインタは、機能的には [NewReader](https://golang.org/pkg/bytes/#NewReader)(nil) と同等となりました. Go 1.12 より前では、前者は完全には後者の代替とはなりませんでした.

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

`Reader.Read` がカーネルからエントロピーを読むのを待っている間60秒以上ブロックされた最初のときに、警告が標準エラーに出力されるようになりました.

FreeBSDでは、`Reader` は利用可能ならば `getrandom` システムコールを、そうでなければ `/dev/urandom` を使うようになりました.

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

このリリースではアセンブリの実装が削除され、純粋な Go バージョンのみが残されています. Go コンパイラの生成するコードは、CPU に依りますが、ちょっと良かったり悪かったりします. RC4 は安全ではないため、レガシーシステムとの互換性のためだけに使用してください.

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

クライアントが TLS のように見えない初期メッセージを送信した場合、サーバーはアラートで応答しなくなり、[RecordHeaderError](https://golang.org/pkg/crypto/tls/#RecordHeaderError) の新しいフィールドで、基礎となる `net.Conn` にそれを露出します.

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

クエリカーソルは、[Row.Scan](https://golang.org/pkg/database/sql/#Row.Scan) メソッドに [*Rows](https://golang.org/pkg/database/sql/#Rows) の値を渡すことで取得できるようになりました.

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

新しい [Delete](https://golang.org/pkg/expvar/#Map.Delete) メソッドでは、[Map](https://golang.org/pkg/expvar/#Map) からキーと値のペアを削除できます.

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

テストを容易にするために、マップはキー順に印刷されるようになりました. 順序付け規則は:

* 該当する場合、nil は最低として比較します
* 整数、浮動小数点数、文字列は `<` で並べます
* NaN は NaN でない浮動小数点数より小さいものとして比較します
* ブールは true の前に false として比較します
* 複素数は実数の後に虚数を比較します
* ポインタはマシンアドレスで比較します
* チャネルの値はマシンアドレスで比較します
* 構造体は各フィールドを順番に比較します
* 配列は各要素を順番に比較します
* インタフェース値は、最初に `reflect.Type` によって具体的な型で比較し、次に具体的な値によって前述の規則で説明されているように比較します

`map` を表示するとき、NaN のような非反射キー値は以前は `<nil>` として表示されていました. このリリースでは、正しい値が表示されます.

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

[cmd/doc](https://golang.org/cmd/doc/) のいくつかの未解決の問題に対処するために、このパッケージには、ASTデータを消去するかどうかを制御する、新しい [Mode](https://golang.org/pkg/go/doc/#Mode) ビット、`PreserveAST` を持つようになりました.

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

[File](https://golang.org/pkg/go/token#File) 型は、与えられた行の開始位置を返す新しい [LineStart](https://golang.org/pkg/go/token#File.LineStart) フィールドを持つようになりました. これは、アセンブリなど、Go 以外のファイルをときどき処理するプログラムで特に便利ですが、ファイルの位置を識別するのは `token.Pos` メカニズムを使用することを希望します.

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

[RegisterFormat](https://golang.org/pkg/image/#RegisterFormat) 関数はコンカレントな利用に安全になりました.

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

16色以下のパレットカラー画像のエンコード出力がより小さくなりました.

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

新しい [StringWriter](https://golang.org/pkg/io#StringWriter) インターフェースが [WriteString](https://golang.org/pkg/io/#WriteString) 関数をラップします.

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

関数 [`Sin`](https://golang.org/pkg/math/#Sin)、[`Cos`](https://golang.org/pkg/math/#Cos)、[`Tan`](https://golang.org/pkg/math/#Tan)、および [`Sincos`](https://golang.org/pkg/math/#Sincos) は Payne-Hanek の範囲縮小を大きな引数に適用するようになりました. これにより、より正確な答えが得られますが、以前のリリースの結果と少しずつは一致しません.

### [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)、[Div](https://golang.org/pkg/math/bits/#Div) が `uint`、`uint32`、`uint64` で利用可能になりました.

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

[Dialer.DualStack](https://golang.org/pkg/net/#Dialer.DualStack) 設定は無視されるようになり、非推奨になりました. RFC 6555 Fast Fallback ("Happy Eyeballs") がデフォルトで有効になりました. 無効にするには、[Dialer.FallbackDelay](https://golang.org/pkg/net/#Dialer.FallbackDelay) を負の値に設定します.

同様に、[Dialer.KeepAlive](https://golang.org/pkg/net/#Dialer.KeepAlive) がゼロの場合、TCP キープアライブはデフォルトで有効になりました. 無効にするには、負の値に設定します.

Linux では、[UnixConn](https://golang.org/pkg/net/#UnixConn)から [TCPConn](https://golang.org/pkg/net/#TCPConn) にコピーするときに [splice システムコール](http://man7.org/linux/man-pages/man2/splice.2.html)が使用されるようになりました.

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

HTTP サーバはプレーンテキストの "400 Bad Request" 応答で HTTPS サーバ への誤ったHTTP 要求を拒否するようになりました.

新しい [Client.CloseIdleConnections](https://golang.org/pkg/net/http/#Client.CloseIdleConnections) メソッドは、`Client` の基礎となる `Transport` の `CloseIdleConnections` がある場合はそれを呼び出すようになりました.

[Transport](https://golang.org/pkg/net/http/#Transport) は、HTTP Trailers を宣言する HTTP 応答を拒否しなくなりましたが、チャンクエンコーディングは使用しません. 代わりに、宣言された HTTP Trailers をただ無視するようになりました.

[Transport](https://golang.org/pkg/net/http/#Transport) は、Go 1.10～1.11 のように厳密には、HTTP/2 サーバーからアドバタイズされた `MAX_CONCURRENT_STREAMS` 値を取り扱わなくなりました. デフォルトの動作は Go 1.9 に戻りました. サーバーへの各接続は最大 `MAX_CONCURRENT_STREAMS` 要求をアクティブにすることができ、その後必要に応じて新しいTCP接続が作成されます. Go 1.10 と Go 1.11 では、http2 パッケージは新しい接続を作成する代わりにブロックしてリクエストが終了するのを待ちます. より厳密な動作に戻すには、[golang.org/x/net/http2](https://godoc.org/golang.org/x/net/http2) パッケージを直接インポートし、[Transport.StrictMaxConcurrentStreams](https://godoc.org/golang.org/x/net/http2#Transport.StrictMaxConcurrentStreams)を `true` に設定します.

### [net/url](https://golang.org/pkg/net/url/)
[`Parse`](https://golang.org/pkg/net/url/#Parse)、[`ParseRequestURI`](https://golang.org/pkg/net/url/#ParseRequestURI)、および[`URL.Parse`](https://golang.org/pkg/net/url/#URL.Parse)は、NULL、タブ、および改行を含むASCII制御文字を含むURLに対してエラーを返すようになりました.

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

[ReverseProxy](https://golang.org/pkg/net/http/httputil/#ReverseProxy) は WebSocket のリクエストを自動的にプロキシーするようになりました.

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

新しい [ProcessState.ExitCode](https://golang.org/pkg/os/#ProcessState.ExitCode) メソッドは、プロセスの終了コードを返します.

ModeTypeで [FileMode](https://golang.org/pkg/os/#FileMode) をマスクするときに、`ModeDevice | ModeCharDevice` で回復することを許すために、`ModeCharDevice` が `ModeType` ビットマスクに追加されました.

新しい関数 [UserHomeDir](https://golang.org/pkg/os/#UserHomeDir) は、現在のユーザーのホームディレクトリを返します.

[RemoveAll](https://golang.org/pkg/os/#RemoveAll) はほとんどの Unix システムで4096文字を超えるパスをサポートするようになりましました.

[File.Sync](https://golang.org/pkg/os/#File.Sync) は、macOS で `F_FULLFSYNC` を使用してファイルの内容を永続記憶に正しくフラッシュするようになりました. これにより、メソッドの実行速度が以前のリリースより遅くなる可能性があります.

[File](https://golang.org/pkg/os/#File) は、[syscall.RawConn](https://golang.org/pkg/syscall/#RawConn) インターフェイス値を返す [SyscallConn](https://golang.org/pkg/os/#File.SyscallConn) メソッドをサポートするようになりました. これは、基礎となるファイル記述子に対してシステム固有の操作を呼び出すために使用されることがあります.

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

[IsAbs](https://golang.org/pkg/path/filepath/#IsAbs) 関数は、Windows 上で `NUL` などの予約されたファイル名を渡されたときに true を返すようになりました. ([予約名のリスト](https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file#naming-conventions))

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

新しい [MapIter](https://golang.org/pkg/reflect#MapIter) 型は、map を走査するためのイテレータです. この型は [Value](https://golang.org/pkg/reflect#Value)型の新しい [MapRange](https://golang.org/pkg/reflect#Value.MapRange) メソッドを通して公開されます. これは、範囲ステートメントと同じ繰り返しセマンティクスに従い、`Next` はイテレータを進め、`Key/Value` は各エントリにアクセスします.

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

ロックの競合を回避するために [Copy](https://golang.org/pkg/regexp/#Regexp.Copy) は必要なくなったため、一部非推奨のコメントが付けられました. [Copy](https://golang.org/pkg/regexp/#Regexp.Copy) を使用する理由が、異なる [Longest](https://golang.org/pkg/regexp/#Regexp.Longest) 設定で2つのコピーを作成することである場合は、コピーが依然として適切である可能性があります.

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

新しい [BuildInfo](https://golang.org/pkg/runtime/debug/#BuildInfo) 型は、モジュールサポート付きでビルドされたバイナリでのみ利用可能な、実行中のバイナリから読み込まれたビルド情報を公開します. これには、メインパッケージパス、メインモジュール情報、およびモジュールの依存関係が含まれます. この型は [BuildInfo](https://golang.org/pkg/runtime/debug/#BuildInfo) の [ReadBuildInfo](https://golang.org/pkg/runtime/debug/#ReadBuildInfo) 関数を通して与えられます.

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

新しい関数 [ReplaceAll](https://golang.org/pkg/strings/#ReplaceAll) は、値の重複していないすべてのインスタンスを別のもので置き換えた文字列のコピーを返します.

ゼロ値の [Reader](https://golang.org/pkg/strings/#Reader) へのポインタは、機能的には [NewReader](https://golang.org/pkg/strings/#NewReader)(nil) と同等となりました. Go 1.12 より前では、前者は完全には後者の代替とはなりませんでした.

新しい [Builder.Cap](https://golang.org/pkg/strings/#Builder.Cap) メソッドは、ビルダーの基礎となるバイトスライスの容量を返します.

文字マッピング関数 [Map](https://golang.org/pkg/strings/#Map)、[Title](https://golang.org/pkg/strings/#Title)、[ToLower](https://golang.org/pkg/strings/#ToLower)、[ToLowerSpecial](https://golang.org/pkg/strings/#ToLowerSpecial)、[ToTitle](https://golang.org/pkg/strings/#ToTitle)、[ToTitleSpecial](https://golang.org/pkg/strings/#ToTitleSpecial)、[ToUpper](https://golang.org/pkg/strings/#ToUpper)、[ToUpperSpecial](https://golang.org/pkg/strings/#ToUpperSpecial) は有効な UTF-8 を返すことを保証するようになりました. 以前のリリースでは、入力が無効な UTF-8 で、文字置換を適用する必要がなかった場合、これらのルーチンは変更せず無効な UTF-8 を誤って返しました.

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

64ビットiノードが FreeBSD 12 でサポートされるようになりました. いくつかの型はそれに応じて調整されました.

Unix ソケット ([AF_UNIX](https://blogs.msdn.microsoft.com/commandline/2017/12/19/af_unix-comes-to-windows/)) アドレスファミリは、互換性のあるバージョンの Windows でサポートされるようになりました.

新しい関数 [Syscall18](https://golang.org/pkg/syscall/?GOOS=windows&GOARCH=amd64#Syscall18) が Windows 用に導入され、最大18個の引数を持つ呼び出しが可能になりました.

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

`Callback` 型と `NewCallback` 関数は改名されました. それらは現在それぞれ [Func](https://golang.org/pkg/syscall/js/?GOOS=js&GOARCH=wasm#Func) と [FuncOf](https://golang.org/pkg/syscall/js/?GOOS=js&GOARCH=wasm#FuncOf) と呼ばれています. これは破壊的な変更ですが、WebAssembly サポートはまだ実験的なものであり、[Go 1 の互換性の約束](https://golang.org/doc/go1compat)にはまだ準じていません. 古い名前を使用しているコードはすべて更新する必要があります.

型が新しい [Wrapper](https://golang.org/pkg/syscall/js/?GOOS=js&GOARCH=wasm#Wrapper) インターフェースを実装している場合、[ValueOf](https://golang.org/pkg/syscall/js/?GOOS=js&GOARCH=wasm#ValueOf) はそれを使用してその型の JavaScript 値を返します.

ゼロ[値](https://golang.org/pkg/syscall/js/?GOOS=js&GOARCH=wasm#Value)の意味が変わりました. それは今や数値のゼロではなく、JavaScript の `undefined` を意味します. これは破壊的な変更ですが、WebAssembly サポートはまだ実験的なものであり、[Go 1 の互換性の約束](https://golang.org/doc/go1compat)にはまだ準じていません. ゼロ[値](https://golang.org/pkg/syscall/js/?GOOS=js&GOARCH=wasm#Value)が数値のゼロを意味することに依存するコードはすべて更新する必要があります.

新しい [Value.Truthy](https://golang.org/pkg/syscall/js/?GOOS=js&GOARCH=wasm#Value.Truthy) メソッドは、与えられた値の [JavaScript "truthiness"](https://developer.mozilla.org/en-US/docs/Glossary/Truthy) を報告します.

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

[-benchtime](https://golang.org/cmd/go/#hdr-Testing_flags) フラグは、"x"で終わる値のときに、明示的な反復回数の設定をサポートするようになりました. 例えば `-benchtime=100x` はベンチマークを100回実行します.

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

テンプレートを実行するときに、エラーの中で長いコンテキスト値が切り詰められなくなりました.

変更前:

```
executing "tmpl" at <.very.deep.context.v...>: map has no entry for key "notpresent"
```

変更後:

```
executing "tmpl" at <.very.deep.context.value.notpresent>: map has no entry for key "notpresent"
```

もしテンプレートによって呼び出されたユーザ定義関数がパニックになった場合、そのパニックはキャッチされ、`Execute` または `ExecuteTemplate` メソッドによってエラーとして返されるようになりました.

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

`$GOROOT/lib/time/zoneinfo.zip` のタイムゾーンデータベースがバージョン2018iに更新されました. この ZIP ファイルは、タイムゾーンデータベースがオペレーティングシステムによって提供されていない場合にのみ使用されることに注意してください.

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

nil `unsafe.Pointer` を `uintptr` に変換して、算術に戻すことは無効です. (これはすでに無効でしたが、コンパイラの不正動作を引き起こすようになりました.）