この記事は https://golang.org/doc/go1.13 を日本語訳したものです. 前のバージョンはこちら: Go 1.12 リリースノート 日本語訳. 次のバージョンはこちら: Go 1.14 リリースノート 日本語訳.
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進整数リテラル: プレフィックス
0b
や0B
は、0b1011
など、2進整数リテラルを示します. -
8進整数リテラル: プレフィックス
0o
や0O
は、0o660
など、8進整数リテラルを示します. 先頭の0
とそれに続く8進数による、既存の8進表記は有効なままです. -
16進浮動小数点数リテラル: プレフィックス
0x
、0X
は0x1.0p-1021
のように16進形式で、浮動小数点数の仮数を表現することに使用することができます. 16進数の浮動小数点数は、p
またはP
の文字のあとに10進の指数が書かれるような指数が必要です. 指数は仮数を2の冪乗でスケーリングします. -
虚数リテラル: 虚数サフィックス
i
は、任意の(2進数、10進数、16進数)整数または浮動小数点リテラルと一緒に使用できるようになりました. -
数字セパレータ: 数値リテラルの数字は、
1_000_000
、0b_1010_0110
、3.1415_9265
のように、アンダースコアを使用して区切る(グループ化する)ことができるようになりました. アンダースコアはどの2つの数字の間にも、リテラルプレフィックスと最初の数字の間にも出現することができます.
符号付きシフトカウント提案に従って、Go 1.13 は シフトカウントが非負整数でなければならないという制限を削除しました. この変更は、単に <<
、>>
演算子の制限(今回削除された)を満たすために導入された、多くの人工的な uint
変換の必要性を削除します.
これらの言語の変更は、コンパイラーへの変更及びパッケージライブラリ go/scanner
、text/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 は選ばれ、どのプロキシによってもサポートされていなければ指定のデータベースに直接接続するようフォールバックします. もし GOSUMDB
が off
に設定されていれば、チェックサムデータベースは調べられず、go.sum
にすでに存在しているチェックサムのみが検証されます.
デフォルトのプロキシとチェックサムデータベースにアクセスできない(たとえば、ファイアウォールやサンドボックスの構成に起因します)ユーザは、GOPROXY
を direct
、 GOSUMDB
を off
に設定することで利用を無効にすることができます. 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 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
ディレクティブ を使用することによって、無効なバージョンを有効なバージョンに置き換えることができます. もし置き換えがコミットハッシュの場合、上記のように適切な擬似バージョンに解決されます. 例えば
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
は go
コマンドによって認識されるユーザごとの環境変数のデフォルト値をセットするための -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進数のプレフィクス(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
コマンドは、コマンドを除いて、常に出力にパッケージ項を含むようになりました. これは以前の、ある種の条件でパッケージ句が省略されることを引き起こしていた、ヒューリスティックを使った挙動を置き換えます
ランタイム
範囲外パニックメッセージに、範囲外だったインデックスとスライスの長さ(または容量)が含まれるようになりました. たとえば、長さ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 はエラー値の提案で最初に提案され、関連するイシューで議論されたような、エラーラッピングのサポートを含みます.
エラー e
は w
を返す Unwrap
メソッドを提供することによって、別のエラー w
を ラップ することができます.
e
と w
の両方がプログラムで利用できるので、e
は w
に追加コンテキストを提供したり、プログラムは w
に基づいて決定を行うことができるから再解釈を提供したりすることが出来ます.
ラッピングをサポートするために、fmt.Errorf
はラップされたエラーを作成するための %w
述語を持つようになり、errors
パッケージの3つの新しい関数 (errors.Unwrap
、errors.Is
、errors.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 に従い、ParsePKCS8PrivateKey
、MarshalPKCS8PrivateKey
、ParsePKIXPublicKey
関数によって、証明書および証明書要求でサポートされるようになりました.
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
メソッドは、Rat
を uint64
値に設定します.
Float.Parse
に関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 言語への変更 を参照してください.
Int.SetString
に関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 言語への変更 を参照してください.
Rat.SetString
は、十進数ではない浮動小数点表現を受け入れるようになりました.
math/bits
Add
、Sub
、Mul
、RotateLeft
、ReverseBytes
の実行時間が、入力に依存しないことが保証されるようになりました.
net
resolv.conf
に use-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.WriteBufferSize
と Transport.ReadBufferSize
で、Transport
の読み書きのバッファサイズが指定できます. いずれかのフィールドが 0 の場合、デフォルトサイズの 4KB が使用されます.
新しいフィールド Transport.ForceAttemptHTTP2
は、ゼロでない Dial
関数、 DialTLS
関数、DialContext
関数、TLSClientConfig
が提供されたときに HTTP/2 を有効にするかどうかをコントロールします.
Transport.MaxConnsPerHost
は HTTP/2 で正しく動作するようになりました.
TimeoutHandler
の ResponseWriter
は、Pusher
と Flusher
インターフェースを実装するようになりました.
StatusCode 103 "Early Hints"
が追加されました.
Transport
は、可能であれば Request.Body
の io.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.Caller
、runtime.Callers
は、PKG
のグローバル変数を初期化する関数を、PKG.init.ializers
の代わりに PKG.init
として参照するようになりました.
strconv
strconv.ParseFloat
、strconv.ParseInt
、strconv.ParseUint
に関して、基数が0であれば、アンダースコアを読みやすさのために数字の間に入れてもよろしいです. 詳細については、 言語への変更 を参照してください.
strings
新しい ToValidUTF8
関数は、無効な UTF-8 バイトシーケンスのそれぞれの連続を与えられた文字列に置き換えた、与えられた文字列のコピーを返します
sync
Mutex.Lock
、Mutex.Unlock
、RWMutex.Lock
、RWMutex.RUnlock
、Once.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
の間でバイトコピーをするために、TypedArrayOf
は CopyBytesToGo
と CopyBytesToJS
で置き換えられました.
testing
ベンチマークの実行時に、B.N
は四捨五入されなくなりました.
新しいメソッド B.ReportMetric
で、ユーザーはカスタムベンチマークメトリクスをレポートしたり、組み込みメトリクスを上書きしたりすることができます.
テストフラグが、テストのために生成された main
関数によって呼び出される、新しい Init
関数に登録されるようになりました. 結果として、テストフラグはテストバイナリの実行時にのみ登録されるようになり、パッケージの初期化中に flag.Parse
を呼ぶパッケージはテストの失敗を引き起こす可能性があります.
text/scanner
新しい Go の数値リテラル、特に 0b
/0B
プレフィックスの2進数リテラル、0o
/0O
プレフィックスの8進数リテラル、16進数仮数の浮動小数点数を認識するよう、スキャナが更新されました. また、新しい AllowDigitSeparators
モードでは、数値リテラルに桁区切り記号(後方互換性のためにデフォルトでオフ)としてアンダースコアを含めることができます. 詳細については、 言語への変更 を参照してください.
text/template
新しい slice 関数 は、最初の引数を以降の引数でスライスした結果を返します.
time
Format
と Parse
で、通算日(Day-of-year)がサポートされるようになりました.
新しい Duration
のメソッド Microseconds
と Milliseconds
は、それぞれの名前の単位の整数カウントとして期間を返します.
unicode
unicode
パッケージと、システム全体の関連するサポートが Unicode 10.0 から、七つの新しいスクリプトと66の新しい絵文字を含む684の新しい文字が追加された Unicode 11.0 に更新されました.