前書き
Go 1.13 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.13 Release Notes
次のバージョン:Go1.14のリリースノート(日本語訳)
前のバージョン:Go1.12のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.13の紹介
最新のGoリリースであるバージョン1.13は、Go 1.12 から6か月後に登場しました。変更のほとんどは、ツールチェーン、ランタイム、およびライブラリの実装にあります。リリースは常にGo 1の互換性の約束 を維持しています。ほとんどのGoプログラムは、これまで通りにコンパイルおよび実行されることを期待しています。
Go 1.13以降、go
コマンドはデフォルトでGoogleが運営するGoモジュールミラーとGoチェックサムデータベースを使用してモジュールをダウンロードおよび認証します。これらのサービスに関するプライバシー情報についてはこちら
を、これらのサーバーの使用を無効にする方法や異なるサーバーを使用する方法を含む設定の詳細についてはgoコマンドのドキュメント
を参照してください。非公開モジュールに依存している場合は、環境の設定に関するドキュメント
を参照してください。
言語の変更
数値リテラル提案 に従い、Go 1.13はより統一された現代的な数値リテラルのプレフィックスをサポートします。
バイナリ整数リテラル
: プレフィックス0b
または0B
は、0b1011
のようなバイナリ整数リテラルを示します。
8進整数リテラル
: プレフィックス0o
または0O
は、0o660
のような8進整数リテラルを示します。先頭に0
を付けた既存の8進表記は有効なままです。
16進浮動小数点リテラル
: プレフィックス0x
または0X
は、0x1.0p-1021
のように16進形式で浮動小数点数の仮数を表現するために使用できます。16進浮動小数点数は常に指数を持ち、p
またはP
の文字と10進の指数で書かれます。指数は仮数を2の指数乗でスケールします。
虚数リテラル
: 虚数のサフィックスi
は、任意の(バイナリ、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ではなくWindows 7になりました。これはすでにGoの最小必要バージョンでしたが、後方互換性モードを持つシステムコールの動作に影響を与える可能性があります。これらは今後、ドキュメントに記載された通りに動作します。外部リンクされたバイナリ(cgo
を使用するプログラム)は常により新しいWindowsバージョンを指定していました。
ツール
モジュール
環境変数
GO111MODULE
環境変数は引き続きauto
がデフォルトですが、auto
設定は現在の作業ディレクトリがgo.mod
ファイルを含むディレクトリ内またはその下にある場合にgo
コマンドのモジュール対応モードをアクティブにします。これにより、GOPATH/src
内の既存のコードの移行と、モジュール対応パッケージと非モジュール対応インポーターの並行メンテナンスが簡素化されます。新しいGOPRIVATE
環境変数は、公開されていないモジュールパスを示します。これは、プロキシ経由で取得され、チェックサムデータベースを使用して検証されるモジュールをより細かく制御するための下位レベルのGONOPROXY
およびGONOSUMDB
変数のデフォルト値として機能します。GOPROXY環境変数
は、カンマ区切りのプロキシURLリストまたは特別なトークンdirect
に設定でき、そのデフォルト値
はhttps://proxy.golang.org,direct
です。パッケージパスを含むモジュールに解決する際、go
コマンドはリスト内の各プロキシで候補モジュールパスを順次試みます。到達不能なプロキシまたは404または410以外のHTTPステータスコードは、残りのプロキシを参照せずに検索を終了します。新しいGOSUMDB
環境変数は、まだメインモジュールのgo.sum
ファイルにリストされていないモジュールのチェックサムを照会するデータベースの名前と、オプションで公開鍵とサーバーURLを識別します。GOSUMDB
に明示的なURLが含まれていない場合、URLはチェックサムデータベースのサポートを示すエンドポイントをGOPROXY
URLでプロービングすることによって選択され、どのプロキシでもサポートされていない場合は名前付きデータベースへの直接接続にフォールバックします。GOSUMDB
がoff
に設定されている場合、チェックサムデータベースは参照されず、go.sum
ファイルに既存のチェックサムのみが検証されます。デフォルトのプロキシとチェックサムデータベースに到達できないユーザー(たとえば、ファイアウォールまたはサンドボックス化された構成のため)は、GOPROXY
をdirect
に、またはGOSUMDB
をoff
に設定してその使用を無効にすることができます。go env -w
を使用して、プラットフォームに依存せずにこれらの変数のデフォルト値を設定できます:
|
|
go get
モジュール対応モードでは、-u
フラグを使用したgo get
は、GOPATH
モードでgo get -u
によって更新されるパッケージのセットとより一貫性のある小さなモジュールセットを更新します。go get -u
は引き続きコマンドラインで指定されたモジュールとパッケージを更新しますが、指定されたパッケージによってインポートされたパッケージを含むモジュールのみを追加で更新し、指定されたパッケージを含むモジュールの推移的モジュール要件ではありません。特に、追加の引数なしでgo get -u
は、現在のディレクトリのパッケージの推移的インポートのみを更新します。代わりに、メインモジュールによって推移的にインポートされたすべてのパッケージ(テスト依存関係を含む)を更新するには、go get -u all
を使用します。上記のgo get -u
の変更の結果として、go get
サブコマンドはもはや-m
フラグをサポートしていません。これは、go get
がパッケージをロードする前に停止する原因となっていました。-d
フラグは引き続きサポートされており、指定されたパッケージの依存関係をビルドするために必要なソースコードをダウンロードした後にgo get
を停止させ続けます。デフォルトでは、モジュールモードのgo get -u
はGOPATH
モードと同様に非テスト依存関係のみをアップグレードします。現在は-t
フラグも受け入れ、(GOPATH
モードと同様に)go get
がコマンドラインで指定されたパッケージのテストによってインポートされたパッケージを含めるようにします。モジュール対応モードでは、go get
サブコマンドはバージョン接尾辞@patch
をサポートするようになりました。@patch
接尾辞は、指定されたモジュールまたは指定されたパッケージを含むモジュールが、ビルドリストに見つかったバージョンと同じメジャーおよびマイナーバージョンを持つ最高のパッチリリースに更新されるべきであることを示します。バージョン接尾辞なしでgo get
に引数として渡されたモジュールが、最新のリリースバージョンよりも新しいバージョンで既に必要とされている場合、それは新しいバージョンのままです。これはモジュール依存関係の-u
フラグの動作と一致しています。これにより、プレリリースバージョンからの予期しないダウングレードが防止されます。新しいバージョン接尾辞@upgrade
はこの動作を明示的に要求します。@latest
は現在のバージョンに関係なく最新バージョンを明示的に要求します。
バージョン検証
バージョン管理システムからモジュールを抽出する際、go
コマンドは要求されたバージョン文字列に対して追加の検証を行います。+incompatible
バージョン注釈は、モジュールの導入以前のリポジトリに対するセマンティックインポートバージョニング
の要件をバイパスします。go
コマンドは、そのようなバージョンに明示的なgo.mod
ファイルが含まれていないことを確認します。go
コマンドは、疑似バージョン
とバージョン管理メタデータの間のマッピングを検証します。具体的には:
- バージョンプレフィックスは
vX.0.0
の形式であるか、指定されたリビジョンの祖先にあるタグから派生するか、指定されたリビジョン自体にビルドメタデータ を含むタグから派生する必要があります。 - 日付文字列はリビジョンのUTCタイムスタンプと一致する必要があります。
- リビジョンの短い名前は、
go
コマンドが生成するものと同じ文字数を使用する必要があります(git
で使用されるSHA-1ハッシュの場合、12桁のプレフィックス)。
メインモジュールのrequireディレクティブ
が無効な疑似バージョンを使用している場合、通常はバージョンをコミットハッシュに削除してgo list -m all
やgo mod tidy
などのgo
コマンドを再実行することで修正できます。たとえば、
|
|
は
|
|
に削除でき、現在は
|
|
に解決されます。メインモジュールの推移的依存関係の1つが無効なバージョンまたは疑似バージョンを必要とする場合、無効なバージョンはメインモジュールのgo.mod
ファイル内のreplaceディレクティブ
を使用して有効なものに置き換えることができます。置き換えがコミットハッシュである場合、上記のように適切な疑似バージョンに解決されます。たとえば、
|
|
は現在
|
|
に解決されます。
Goコマンド
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
はそのディレクトリ内にパッケージ引数に一致するメインパッケージの実行可能ファイルを書き込みます。go build
フラグ-tags
は、ビルドタグのカンマ区切りリストを受け取るようになり、GOFLAGS
内で複数のタグを許可します。スペース区切り形式は非推奨ですが、まだ認識されており、維持されます。go generate
は、ファイルがディレクティブを検索するために使用されるがビルド中に無視されるように、generate
ビルドタグを設定します。Go 1.12のリリースノートで発表された
ように、バイナリのみのパッケージはもはやサポートされていません。バイナリのみのパッケージ(//go:binary-only-package
コメントでマークされた)をビルドすると、エラーが発生します。
コンパイラツールチェーン
コンパイラには、より正確なエスケープ解析の新しい実装があります。ほとんどのGoコードにとっては改善(つまり、より多くのGo変数と式がヒープではなくスタックに割り当てられる)であるはずです。しかし、この精度の向上により、以前は動作していた無効なコードが壊れる可能性もあります(たとえば、unsafe.Pointerの安全ルール
に違反するコード)。関連すると思われる回帰が発生した場合、古いエスケープ解析パスはgo build -gcflags=all=-newescape=false
で再有効化できます。古いエスケープ解析を使用するオプションは、将来のリリースで削除されます。コンパイラはもはや浮動小数点または複素数定数をgo_asm.h
ファイルに出力しません。これらは常にアセンブリコード内で数値定数として使用できない形式で出力されていました。
アセンブラ
アセンブラは、ARM v8.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 doc コマンドは、コマンドを除いて常に出力にパッケージ句を含めるようになりました。これは、以前のヒューリスティックを使用した動作を置き換え、特定の条件下でパッケージ句が省略される原因となっていました。
ランタイム
範囲外のパニックメッセージには、範囲外のインデックスとスライスの長さ(または容量)が含まれるようになりました。たとえば、長さ1のスライスでs[3]
を実行すると、「runtime error: index out of range [3] with length 1」というパニックが発生します。
このリリースでは、defer
のほとんどの使用のパフォーマンスが30%向上しています。
ランタイムは、共同テナントアプリケーションに利用可能なメモリをオペレーティングシステムに返すのにより積極的になりました。以前は、ランタイムはヒープサイズのスパイクの後に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には、Error Values提案
で最初に提案され、関連する問題
で議論されたエラーラッピングのサポートが含まれています。エラーe
は、Unwrap
メソッドを提供して別のエラーw
をラップできます。e
とw
の両方がプログラムで利用可能であり、e
がw
に追加のコンテキストを提供したり、w
を再解釈したりしながら、プログラムがw
に基づいて決定を下すことができます。ラッピングをサポートするために、fmt.Errorf
にはラップされたエラーを作成するための%w
動詞が追加され、errors
パッケージの3つの新しい関数(errors.Unwrap
、errors.Is
、およびerrors.As
)がラップされたエラーのアンラップと検査を簡素化します。詳細については、errorsパッケージのドキュメント
を読むか、Error Value FAQ
を参照してください。近日中にブログ投稿も予定されています。
ライブラリの小さな変更
いつものように、Go 1の互換性の約束 を念頭に置いて、ライブラリにさまざまな小さな変更と更新が行われています。
bytes
新しいToValidUTF8 関数は、無効なUTF-8バイトシーケンスの各ランを指定されたスライスで置き換えた指定されたバイトスライスのコピーを返します。
context
WithValue
によって返されるコンテキストのフォーマットはもはやfmt
に依存せず、同じ方法で文字列化されません。以前の文字列化に正確に依存するコードに影響を与える可能性があります。
crypto/tls
SSLバージョン3.0(SSLv3)のサポートはGo 1.14で削除される予定です 。SSLv3はTLSに先立つ暗号的に破られた プロトコルであることに注意してください。SSLv3は常にデフォルトで無効になっていましたが、Go 1.12では誤ってサーバー側でデフォルトで有効になっていました。現在は再びデフォルトで無効になっています(SSLv3はクライアント側ではサポートされていませんでした)。Ed25519証明書はTLSバージョン1.2および1.3でサポートされるようになりました。
crypto/x509
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
印刷動詞%x
と%X
は、浮動小数点数と複素数をそれぞれ小文字と大文字の16進表記でフォーマットするようになりました。新しい印刷動詞%O
は、整数を基数8でフォーマットし、0o
プレフィックスを出力します。スキャナーは、16進浮動小数点値、数字を区切るアンダースコア、および先頭の0b
と0o
プレフィックスを受け入れるようになりました。詳細については、言語の変更
を参照してください。Errorf
関数には新しい動詞%w
があり、そのオペランドはエラーでなければなりません。Errorf
から返されるエラーには、%w
のオペランドを返すUnwrap
メソッドがあります。
go/scanner
スキャナーは、新しいGo数値リテラル、具体的には0b/0B
プレフィックスを持つバイナリリテラル、0o/0O
プレフィックスを持つ8進リテラル、および16進仮数を持つ浮動小数点数を認識するように更新されました。虚数のサフィックスi
は、任意の数値リテラルと共に使用できるようになり、アンダースコアはグループ化のための数字の区切り文字として使用できます。詳細については、言語の変更
を参照してください。
go/types
型チェッカーは、整数シフトの新しいルールに従うように更新されました。詳細については、言語の変更 を参照してください。
html/template
<script>
タグを使用する際に、type
属性が “module” に設定されている場合、コードは JavaScript モジュールスクリプト
として解釈されるようになりました。
log
新しい Writer
関数は、標準ロガーの出力先を返します。
math/big
新しい Rat.SetUint64
メソッドは、Rat
を uint64
値に設定します。
Float.Parse
では、基数が 0 の場合、読みやすさのために数字の間にアンダースコアを使用できます。詳細は言語の変更
を参照してください。
Int.SetString
でも、基数が 0 の場合、読みやすさのために数字の間にアンダースコアを使用できます。詳細は言語の変更
を参照してください。
Rat.SetString
は、非10進数の浮動小数点表現を受け入れるようになりました。
math/bits
Add
、Sub
、Mul
、RotateLeft
、および ReverseBytes
の実行時間は、入力に依存しないことが保証されるようになりました。
net
Unix システムで resolv.conf
に use-vc
が設定されている場合、DNS 解決に TCP が使用されます。
新しいフィールド ListenConfig.KeepAlive
は、リスナーによって受け入れられるネットワーク接続のキープアライブ期間を指定します。このフィールドが 0(デフォルト)の場合、TCP キープアライブが有効になります。無効にするには、負の値を設定してください。
キープアライブタイムアウトによって閉じられた接続での I/O から返されるエラーは、呼び出された場合に true
を返す Timeout
メソッドを持ちます。これにより、キープアライブエラーを、SetDeadline
メソッドや類似のメソッドによって設定された期限切れによるエラーと区別するのが難しくなることがあります。期限を使用し、Timeout
メソッドや os.IsTimeout
を使用してそれを確認するコードは、キープアライブを無効にするか、errors.Is(syscall.ETIMEDOUT)
(Unix システム上)を使用することを検討するかもしれません。これは、キープアライブタイムアウトに対しては true
を返し、期限切れタイムアウトに対しては false
を返します。
net/http
新しいフィールド Transport.WriteBufferSize
と Transport.ReadBufferSize
により、Transport
の書き込みおよび読み込みバッファのサイズを指定できます。どちらかのフィールドがゼロの場合、デフォルトサイズの 4KB が使用されます。
新しいフィールド Transport.ForceAttemptHTTP2
は、非ゼロの Dial
、DialTLS
、DialContext
関数または TLSClientConfig
が提供された場合に HTTP/2 が有効になるかどうかを制御します。
Transport.MaxConnsPerHost
は、HTTP/2 でも正しく動作するようになりました。
TimeoutHandler
の ResponseWriter
は、Pusher
インターフェースを実装するようになりました。
StatusCode
103
"Early Hints"
が追加されました。
Transport
は、Request.Body
の io.ReaderFrom
実装を使用して、ボディの書き込みを最適化するようになりました。
サポートされていない転送エンコーディングに遭遇した場合、http.Server
は HTTP 仕様 RFC 7230 セクション 3.3.1
に従って “501 Unimplemented” ステータスを返すようになりました。
新しい Server
フィールド BaseContext
と ConnContext
により、リクエストおよび接続に提供される Context
値をより細かく制御できるようになりました。
http.DetectContentType
は、RAR シグネチャを正しく検出し、RAR v5 シグネチャも検出できるようになりました。
新しい Header
メソッド Clone
は、レシーバーのコピーを返します。
新しい関数 NewRequestWithContext
が追加され、作成された送信 Request
の全体のライフタイムを制御する Context
を受け入れます。これは、Client.Do
および Transport.RoundTrip
と共に使用するのに適しています。
Transport
は、サーバーがアイドル接続を “408 Request Timeout” レスポンスで正常にシャットダウンしたときにエラーをログに記録しなくなりました。
os
新しい UserConfigDir
関数は、ユーザー固有の設定データに使用するデフォルトディレクトリを返します。
O_APPEND
フラグを使用して File
を開いた場合、その WriteAt
メソッドは常にエラーを返します。
os/exec
Windows では、Cmd
の環境は常に親プロセスの %SYSTEMROOT%
値を継承します。ただし、Cmd.Env
フィールドに明示的な値が含まれている場合は除きます。
reflect
新しい Value.IsZero
メソッドは、Value
がその型のゼロ値であるかどうかを報告します。
MakeFunc
関数は、返される値に対して正確な型一致を要求する代わりに、代入変換を許可するようになりました。これは特に、返される型がインターフェース型であるが、実際に返される値がその型を実装する具体的な値である場合に便利です。
runtime
トレースバック、runtime.Caller
、および runtime.Callers
は、PKG
のグローバル変数を初期化する関数を PKG.init
として参照するようになり、以前の PKG.init.ializers
ではなくなりました。
strconv
strconv.ParseFloat
、strconv.ParseInt
、および strconv.ParseUint
では、基数が 0 の場合、読みやすさのために数字の間にアンダースコアを使用できます。詳細は言語の変更
を参照してください。
strings
新しい ToValidUTF8
関数は、無効な UTF-8 バイトシーケンスの各ランを指定された文字列で置き換えたコピーを返します。
sync
Mutex.Lock
、Mutex.Unlock
、RWMutex.Lock
、Mutex.RUnlock
、および Once.Do
の高速パスは、呼び出し元にインライン化されるようになりました。amd64 の非競合ケースでは、これらの変更により Once.Do
は2倍の速さになり、Mutex
/RWMutex
メソッドは最大10%速くなります。
大きな Pool
は、ストップ・ザ・ワールドのポーズ時間を増加させなくなりました。
Pool
は、GC のたびに完全に再ポピュレートされる必要がなくなりました。今では、すべてのオブジェクトを解放するのではなく、いくつかのオブジェクトを GC を超えて保持し、Pool
のヘビーユーザーに対する負荷のスパイクを減少させます。
syscall
Darwin ビルドから _getdirentries64
の使用が削除され、Go バイナリを macOS App Store にアップロードできるようになりました。
Windows では、新しい ProcessAttributes
および ThreadAttributes
フィールドが SysProcAttr
に導入され、新しいプロセスを作成する際のセキュリティ設定を公開します。
Windows でゼロモードの Chmod
で EINVAL
が返されなくなりました。
Errno
型の値は、os
パッケージのエラー値(例えば ErrExist
)に対して errors.Is
を使用してテストできます。
syscall/js
TypedArrayOf
は、バイトスライスと Uint8Array
間でバイトをコピーするために CopyBytesToGo
および CopyBytesToJS
に置き換えられました。
testing
ベンチマークを実行する際、B.N
はもはや丸められません。
新しいメソッド B.ReportMetric
により、ユーザーはカスタムベンチマークメトリックを報告し、組み込みメトリックを上書きできます。
テストフラグは、新しい Init
関数で登録されるようになり、この関数はテスト用に生成された main
関数によって呼び出されます。その結果、テストバイナリを実行する際にのみテストフラグが登録され、パッケージ初期化中に flag.Parse
を呼び出すパッケージはテストが失敗する可能性があります。
text/scanner
スキャナーは、新しい Go 数値リテラル、特に 0b
/0B
プレフィックスのバイナリリテラル、0o
/0O
プレフィックスの8進リテラル、および16進数の仮数を持つ浮動小数点数を認識するように更新されました。また、新しい AllowDigitSeparators
モードにより、数字リテラルにアンダースコアを桁区切りとして含めることができます(後方互換性のためデフォルトではオフ)。詳細は言語の変更
を参照してください。
text/template
新しい slice
関数は、最初の引数を後続の引数でスライスした結果を返します。
time
Format
および Parse
で年の日がサポートされるようになりました。
新しい Duration
メソッド Microseconds
および Milliseconds
は、それぞれの名前の単位の整数カウントとして期間を返します。
unicode
unicode
パッケージとシステム全体の関連サポートが Unicode 10.0 から Unicode 11.0
にアップグレードされ、7つの新しいスクリプトと66の新しい絵文字を含む684の新しい文字が追加されました。