Edited at

Go 1.13 リリースノート

この記事は https://golang.org/doc/go1.13 を日本語訳したものです.


Go 1.13 の紹介

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

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


言語への変更

数値リテラル提案に従って、Go 1.13 はより均一でモダンな数値リテラルプレフィックスのセットをサポートする.


  • 2進整数リテラル: プレフィックス 0b0B は、0b1011 など、2進整数リテラルを示します.


  • 8進整数リテラル: プレフィックス 0o0O は、0o660 など、8進整数リテラルを示します. 先頭の 0 とそれに続く8進数による、既存の8進表記は有効なままです.


  • 16進浮動小数点数リテラル: プレフィックス 0x0X0x1.0p-1021 のように16進形式で、浮動小数点数の仮数を表現することに使用することができます. 16進数の浮動小数点数は、p または P の文字のあとに10進の指数が書かれるような指数が必要です. 指数は仮数を2の累乗でスケーリングします.


  • 虚数リテラル: 虚数サフィックス i は、任意の(2進数、10進数、16進数)整数または浮動小数点リテラルと一緒に使用できるようになりました.


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


符号付きシフトカウント提案に従って、Go 1.13 は シフトカウントが非負整数でなければならないという制限を削除しました. この変更は、単に <<>> 演算子の制限(今回削除された)を満たすために導入された、多くの人工的な uint 変換の必要性を削除します.

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

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


ポート

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

GOARCH=wasm では、新しい環境変数 GOWASM がバイナリをコンパイルする時に使用する、実験的な機能のカンマ区切りのリストを取ります.

有効な値はこちらにドキュメントされています.


AIX

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


Android

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


Darwin

Go 1.12 のリリースノートでアナウンスされたとおり、Go 1.13 は macOS 10.11 El Capitan 以降を必要とします. 以前のバージョンのサポートは終了しました.


FreeBSD

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


Illumos

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


Windows

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


ツール


モジュール


環境変数

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

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

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

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

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

go env -w GOPROXY=direct

go env -w GOSUMDB=off


go get

モジュール認識モードでは、-u を指定した go get は、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 バージョンアノテーションは、モジュール導入以前のレポジトリに対するセマンティックインポートバージョニングの要求をバイパスします. go コマンドは、そのようなバージョンが明示的に go.mod ファイルに含まれていないことを、検証するようになりました.

go コマンドは、疑似バージョンとバージョン管理のメタデータ間のマッピングを検証するようになりました. 具体的には以下です.


  • バージョンプリフィックスは vX.0.0 形式であるか、指定のリビジョンの祖先のタグから派生しているか、指定したリビジョンそれ自身のビルドメタデータを含むタグから派生している必要があります.


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


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


もし、メインモジュール の中の require ディレクティブが無効な疑似バージョンを使用するのであれば、バージョンを単にコミットハッシュに編集し、go list -m allgo 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 ディレクティブ を使用することによって、無効なバージョンを有効なバージョンに置き換えることができます. もし置き換えがコミットハッシュの場合、上記のように適切な擬似バージョンに解決されます. 例えば

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 envgo コマンドによって認識されるユーザごとの環境変数のデフォルト値をセットするための -w フラグと、それと対となる以前設定したデフォルト値を解除する -u フラグを受け入れるようになりました. go env -w で設定されたデフォルト値は、os.UserConfigDir() 内の go/env ファイルに格納されます.

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

新しい go build フラグ-trimpath は、ビルドの再現性を向上させるため、コンパイルされた実行可能ファイルからすべてのファイルシステムパスを削除します.

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

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

go generate はファイルがディレクティブを検索してもビルド中は無視するための generate ビルドタグをセットするようになりました.

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


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

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

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

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

コンパイラは、浮動小数点定数や複素数定数を go_asm.h に出力しなくなりました.

これらは常に、アセンブリコードで数値定数として使用できない形式で出力されます.


Assembler

アセンブラは、ARM v 8.1 で導入されたアトミック命令の多くをサポートするようになりました.


gofmt

gofmt(及び go fmt)は数値リテラルのプレフィックスと指数部を小文字を使用するように正規化するようになりましたが、16進の数字はそのままにしておきます. これにより新しい8進数のプレフィクス(0O0o になる)を使用する際の可読性が向上し、一貫性のある書換が適用されます. また、gofmt は10進整数の虚数リテラルから不要な先行ゼロを削除するようになりました. (後方互換性のために、0 で始まる整数の虚数リテラルは8進数ではなく10進数と見なされます. 余分な先行ゼロを削除すると、混乱の可能性を回避することができます.) たとえば、0B10100XabcDEF0O6601.2E301i は、gofmt 適用後は、0b10100xabcDEF0o6601.2e31i となります.


godocgo doc

godoc ウェブサーバはもはや主要なバイナリディストリビューションに含まれていません. godoc ウェブサーバをローカルで動かすためには、以下の手順で最初に手動インストールしてください.

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

godoc

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


ランタイム

範囲外パニックメッセージに、範囲外だったインデックスとスライスの長さ(または容量)が含まれるようになりました. たとえば、長さ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 のリリースノートを参照してください.


crypto/ed25519

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


エラーラッピング

Go 1.13 はエラー値の提案で最初に提案され、関連するイシューで議論されたような、エラーラッピングのサポートを含みます.

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

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

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

詳細については、errors パッケージドキュメントを読むか、エラー値 FAQ を見てください. ブログ記事も間もなく掲載されます.


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

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


bytes

新しい ToValidUTF8 関数は、無効な UTF-8 バイトシーケンスのそれぞれの連続を与えられたスライスに置き換えた、与えられたバイトスライスのコピーを返します


context

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


crypto/tls

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

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

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


crypto/x509

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

Ed25519 キーは、RFC 8410 に従い、ParsePKCS8PrivateKeyMarshalPKCS8PrivateKeyParsePKIXPublicKey 関数によって、証明書および証明書要求でサポートされるようになりました.

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


database/sql

新しい NullTime 型は、null である可能性がある time.Time を表します.

新しい NullInt32 型は、null である可能性がある int32 を表します.


debug/dwarf

Data.Type メソッドは、型グラフの中で不明な DWARF に遭遇しても、パニックしなくなりました.

代わりに、UnsupportedType オブジェクト型のコンポーネントを表します.


errors

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

新しい関数 Is は、与えられたエラー値が別のチェーンのエラーと一致するかどうかを報告します.

新しい関数 Unwrap は、もし存在すれば、与えられたエラーで Unwrap を呼んだ結果を返します.


fmt

Errorf 関数は、そのオペランドがエラーでなければならない、新しい述語 %w を持つようになりました. Errorf から返されるエラーは、%w のオペランドを返す Unwrap メソッドを持つようになります.


go/scanner

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


go/types

整数シフトの新しいルールに従うように、タイプチェッカーは更新されました. 詳細については、 言語への変更 を参照してください.


html/template

type 属性に "module" をセットした <script> タグを使った時、コードが JavaScript module script として解釈されるようになりました.


log

新しい Writer 関数は、標準ロガーの出力先を返します.


math/big

新しい Rat.SetUint64 メソッドは、Ratuint64 値に設定します.

Float.Parseに関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 言語への変更 を参照してください.

Int.SetStringに関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 言語への変更 を参照してください.

Rat.SetString は、十進数ではない浮動小数点表現を受け入れるようになりました.


math/bits

AddSubMulRotateLeftReverseBytes の実行時間が、入力に依存しないことが保証されるようになりました.


net

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

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

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


net/http

新しいフィールド Transport.WriteBufferSizeTransport.ReadBufferSize で、Transport の読み書きのバッファサイズが指定できます. いずれかのフィールドが 0 の場合、デフォルトサイズの 4KB が使用されます.

新しいフィールド Transport.ForceAttemptHTTP2 は、ゼロでない Dial 関数、 DialTLS 関数、DialContext 関数、TLSClientConfig が提供されたときに HTTP/2 を有効にするかどうかをコントロールします.

Transport.MaxConnsPerHost は HTTP/2 で正しく動作するようになりました.

TimeoutHandlerResponseWriter は、PusherFlusher インターフェースを実装するようになりました.

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

Transport は、可能であれば Request.Bodyio.ReaderFrom 実装を使用して、ボディの書き込みを最適化するようになりました.

サポートしていない転送エンコーディングに遭遇したとき、http.Server は、HTTP 仕様である RFC 7230 Section 3.3.1 で規定されているように "501 Unimplemented" ステータスを返すようになりました.

Server の新しい BaseContext フィールドと ConnContext フィールドは、リクエストと接続に提供される Context 値をより細かくコントロールすることを許可します.

http.DetectContentType は RAR シグネチャを正しく検出できるようになり、同様に RAR v5 シグネチャも検出できるようになりました.

Header の新しい Clone メソッドは、レシーバーのコピーを返します.

新しい関数 NewRequestWithContext が追加され、Client.Do および Transport.RoundTrip での使用に適した、作成された外向けの Request の全生存期間を制御するコンテキストを受け入れるようになりました.

Transport は、408 "Request Timeout" を使って、アイドルな接続を丁寧に(gracefully)にシャットダウンしたとき、エラーをロギングしなくなりました.


os

新しい UserConfigDir 関数は、ユーザ固有の設定データに使用するためのデフォルトディレクトリを返します,

もし File を O_APPEND フラグで開いたのであれば、WriteAt メソッドは常にエラーを返します.


os/exec

Windows では、Cmd.Env フィールドに明示的な値が含まれていなければ、Cmd の環境は常に親プロセスの %SYSTEMROOT% の値を継承します.


reflect

新しい Value.IsZero メソッドは、Value がその型のゼロ値であるかどうかをレポートします.

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


runtime

トレースバック、runtime.Callerruntime.Callers は、PKG のグローバル変数を初期化する関数を、PKG.init.ializers の代わりに PKG.init として参照するようになりました.


strconv

strconv.ParseFloatstrconv.ParseIntstrconv.ParseUint に関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 言語への変更 を参照してください.


strings

新しい ToValidUTF8 関数は、無効な UTF-8 バイトシーケンスのそれぞれの連続を与えられた文字列に置き換えた、与えられた文字列のコピーを返します


sync

Mutex.LockMutex.UnlockRWMutex.LockRWMutex.RUnlockOnce.Do は呼び出し元でインライン化されるようになりました. amd64 の競合しないケースでは、これらの変更により Once.Do が倍速になり、Mutex/RWMutex メソッドは10%速くなりました.

大きな Pool はストップ・ザ・ワールドのポーズ時間を増やさなくなりました.

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


syscall

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

SysProcAttr の新しい ProcessAttributes フィールドと ThreadAttributes フィールドが Windows で導入され、新しいプロセスを作成したときに、セキュリティ設定をを公開するようになりました.

Windows 上でゼロ Chmod モードで EINVAL が返ることはなくなりました.

Errno 型の値は、ErrExist のように errors.Is を使用して、os パッケージ内のエラー値に対してテストができます.


syscall/js

バイトスライスと Uint8Array の間でバイトコピーをするために、TypedArrayOfCopyBytesToGoCopyBytesToJS で置き換えられました.


testing

ベンチマークの実行時に、B.N は四捨五入されなくなりました.

新しいメソッド B.ReportMetric で、ユーザーはカスタムベンチマークメトリクスをレポートしたり、組み込みメトリクスを上書きしたりすることができます.

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


text/scanner

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


text/template

新しい slice 関数 は、最初の引数を以降の引数でスライスした結果を返します.


time

FormatParse で、通算日(Day-of-year)がサポートされるようになりました.

新しい Duration のメソッド MicrosecondsMilliseconds は、それぞれの名前の単位の整数カウントとして期間を返します.


unicode

unicode パッケージと、システム全体の関連するサポートが Unicode 10.0 から、七つの新しいスクリプトと66の新しい絵文字を含む684の新しい文字が追加された Unicode 11.0 に更新されました.