前書き
Go 1.14 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.14 Release Notes
次のバージョン:Go1.15のリリースノート(日本語訳)
前のバージョン:Go1.13のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.14の紹介
最新のGoリリースであるバージョン1.14は、Go 1.13
から6か月後に登場しました。変更のほとんどはツールチェーン、ランタイム、ライブラリの実装にあります。いつものように、このリリースはGo 1の互換性の約束
を維持しています。ほとんどのGoプログラムはこれまで通りコンパイルおよび実行されることを期待しています。go
コマンドのモジュールサポートは本番環境での使用に準備が整っており、すべてのユーザーに依存関係管理のためにGoモジュールに移行する
ことをお勧めします。Goツールチェーンの問題で移行できない場合は、その問題がオープンな問題
としてファイルされていることを確認してください。(問題がGo1.15のマイルストーンにない場合は、なぜ移行を妨げているのかを教えてください。適切に優先順位を付けることができるようにします。)
言語の変更
重複するインターフェース提案 に従い、Go 1.14では重複するメソッドセットを持つインターフェースの埋め込みが許可されるようになりました。埋め込まれたインターフェースのメソッドは、すでに(埋め込み)インターフェースに存在するメソッドと同じ名前と同一のシグネチャを持つことができます。これは通常(ただし排他的ではない)ダイヤモンド型の埋め込みグラフで発生する問題を解決します。インターフェースで明示的に宣言されたメソッドは、以前と同様に一意 でなければなりません。
ポート
Darwin
Go 1.14はmacOS 10.11 El Capitanで動作する最後のリリースです。Go 1.15ではmacOS 10.12 Sierra以降が必要になります。Go 1.14はmacOSで32ビットバイナリ(darwin/386
ポート)をサポートする最後のGoリリースです。macOS 10.15(Catalina)以降、これらはmacOSによってサポートされなくなります。Goは64ビットのdarwin/amd64
ポートを引き続きサポートします。Go 1.14は、iOS、iPadOS、watchOS、およびtvOSで32ビットバイナリ(darwin/arm
ポート)をサポートする最後のGoリリースになる可能性があります。Goは64ビットのdarwin/arm64
ポートを引き続きサポートします。
Windows
Windows上のGoバイナリには、DEP(データ実行防止)
が有効になりました。Windowsでは、os.OpenFile
を使用してos.O_CREATE
フラグを指定してファイルを作成する場合、またはsyscall.Open
を使用してsyscall.O_CREAT
フラグを指定してファイルを作成する場合、パーミッション引数にビット0o200
(所有者の書き込み権限)が設定されていない場合、ファイルは読み取り専用として作成されます。これにより、Windows上の動作がUnixシステム上の動作に近づきます。
WebAssembly
js.Value
オブジェクトを介してGoから参照されるJavaScript値は、ガベージコレクションの対象となるようになりました。js.Value
値は、==
演算子を使用して比較することができなくなり、代わりにEqual
メソッドを使用して比較する必要があります。js.Value
には、IsUndefined
、IsNull
、およびIsNaN
メソッドが追加されました。
RISC-V
Go 1.14には、Linux上での64ビットRISC-V(GOOS=linux
、GOARCH=riscv64
)の実験的サポートが含まれています。パフォーマンス、アセンブリ構文の安定性、および正確性が進行中であることに注意してください。
FreeBSD
Goは、FreeBSD 12.0以降で64ビットARMアーキテクチャ(freebsd/arm64
ポート)をサポートするようになりました。
ネイティブクライアント(NaCl)
Go 1.13のリリースノートで発表された
ように、Go 1.14ではネイティブクライアントプラットフォーム(GOOS=nacl
)のサポートが削除されました。
Illumos
ランタイムは、runtime.NumCPU
およびGOMAXPROCS
のデフォルト値に対して、ゾーンCPUキャップ(zone.cpu-cap
リソースコントロール)を尊重するようになりました。
ツール
Goコマンド
ベンダリング
メインモジュールにトップレベルのvendor
ディレクトリが含まれており、そのgo.mod
ファイルがgo 1.14
以上を指定している場合、go
コマンドはそのフラグを受け入れる操作に対してデフォルトで-mod=vendor
を使用するようになりました。そのフラグの新しい値である-mod=mod
は、vendor
ディレクトリが存在しない場合と同様に、go
コマンドがモジュールキャッシュからモジュールをロードするようにします。-mod=vendor
が設定されている場合(明示的またはデフォルトで)、go
コマンドはメインモジュールのvendor/modules.txt
ファイルがそのgo.mod
ファイルと一致していることを確認します。go list -m
は、vendor
ディレクトリにパッケージを提供しない推移的依存関係を黙って省略しなくなりました。-mod=vendor
が設定されており、vendor/modules.txt
に記載されていないモジュールに対して情報が要求された場合、明示的に失敗します。
フラグ
go get
コマンドはもはや-mod
フラグを受け入れません。以前は、フラグの設定が無視される
か、ビルドが失敗する
原因となっていました。go.mod
ファイルが読み取り専用であり、トップレベルのvendor
ディレクトリが存在しない場合、-mod=readonly
がデフォルトで設定されます。-modcacherw
は、新しく作成されたディレクトリをモジュールキャッシュ内でデフォルトのパーミッションのままにし、読み取り専用にしないようにgo
コマンドに指示する新しいフラグです。このフラグを使用すると、テストや他のツールがモジュールの検証済みチェックサムに含まれていないファイルを誤って追加する可能性が高くなりますが、go clean -modcache
の代わりにrm -rf
を使用してモジュールキャッシュを削除することができます。-modfile=file
は、モジュールルートディレクトリのgo.mod
ファイルの代わりに別のgo.mod
ファイルを読み書きするようにgo
コマンドに指示する新しいフラグです。モジュールルートディレクトリを決定するためにgo.mod
という名前のファイルがまだ存在している必要がありますが、アクセスされません。-modfile
が指定されている場合、別のgo.sum
ファイルも使用されます。そのパスは、-modfile
フラグから.mod
拡張子をトリミングし、.sum
を追加することで導出されます。
環境変数
GOINSECURE
は、特定のモジュールを直接取得する際にHTTPS接続を要求せず、証明書の検証をスキップするようにgo
コマンドに指示する新しい環境変数です。既存のGOPRIVATE
変数と同様に、GOINSECURE
の値はグロブパターンのカンマ区切りリストです。
モジュール外のコマンド
モジュール対応モードが明示的に有効になっている場合(GO111MODULE=on
を設定することによって)、go.mod
ファイルが存在しない場合、ほとんどのモジュールコマンドの機能は制限されます。たとえば、go build
、go run
、および他のビルドコマンドは、標準ライブラリ内のパッケージとコマンドラインで指定された.go
ファイルとして指定されたパッケージのみをビルドできます。以前は、go
コマンドは各パッケージパスをモジュールの最新バージョンに解決していましたが、モジュールパスやバージョンを記録していませんでした。これにより、遅く、再現性のないビルド
が発生していました。go get
は以前と同様に動作し、go mod download
および明示的なバージョンを指定したgo list -m
も同様です。
+互換性のないバージョン
モジュールの最新バージョンにgo.mod
ファイルが含まれている場合、go get
はそのモジュールの互換性のない
メジャーバージョンにアップグレードしなくなります。ただし、そのようなバージョンが明示的に要求されているか、すでに必要とされている場合を除きます。go list
も、バージョン管理から直接取得する場合、そのようなモジュールの互換性のないメジャーバージョンを省略しますが、プロキシによって報告された場合には含まれることがあります。
go.modファイルのメンテナンス
go mod tidy
以外のgo
コマンドは、メインモジュールの他の(推移的な)依存関係によってすでに暗黙的に指定されている間接依存関係のバージョンを指定するrequire
ディレクティブを削除しなくなりました。go mod tidy
以外のgo
コマンドは、変更が単なる装飾的なものである場合、go.mod
ファイルを編集しなくなりました。-mod=readonly
が設定されている場合、go
コマンドは、go
ディレクティブが欠落しているか、// indirect
コメントが誤っているために失敗しなくなりました。
モジュールのダウンロード
go
コマンドは、モジュールモードでSubversionリポジトリをサポートするようになりました。go
コマンドは、モジュールプロキシや他のHTTPサーバーからのプレーンテキストエラーメッセージのスニペットを含むようになりました。エラーメッセージは、有効なUTF-8であり、グラフィック文字とスペースのみで構成されている場合にのみ表示されます。
テスト
go test -v
は、すべてのテストの終了時ではなく、発生した時点でt.Log
出力をストリーミングするようになりました。
ランタイム
今回のリリースでは、defer
のほとんどの使用において、遅延呼び出しの関数を直接呼び出す場合とほぼ同等のオーバーヘッド(ほぼゼロ)で実行できるようになりました。その結果、オーバーヘッドを気にすることなく、パフォーマンスが重要なコード内でも defer
を使用できるようになりました。
Goroutine は非同期的にプリエンプト可能となりました。そのため、関数呼び出しを伴わないループがスケジューラをデッドロックさせたり、ガベージコレクションを大幅に遅延させたりする可能性がなくなりました。この機能は、windows/arm
、darwin/arm
、js/wasm
、および plan9/*
を除くすべてのプラットフォームでサポートされています。
プリエンプションの実装の結果、Linux や macOS を含む Unix 系システムでは、Go 1.14 でビルドされたプログラムが、以前のリリースでビルドされたプログラムよりも多くのシグナルを受け取るようになります。これは、syscall
や golang.org/x/sys/unix
といったパッケージを使用するプログラムで、遅いシステムコールがより多く EINTR
エラーで失敗することを意味します。これらのプログラムは、エラーに対して何らかの対処(おそらくシステムコールを再試行するループ処理)を実装する必要があります。詳しくは、Linux システムの場合は man 7 signal
、その他のシステムでは同様のドキュメントを参照してください。
ページアロケータはより効率的になり、GOMAXPROCS
の値が高い場合でもロック競合が大幅に減少しました。特に、大量のメモリアロケーションが並行して高速に行われる状況で、低レイテンシと高スループットが実現されています。
また、time.After
、time.Tick
、net.Conn.SetDeadline
などで利用される内部タイマーは、ロック競合が少なく、コンテキストスイッチも減少するなど、より効率的になりました。これはパフォーマンスの向上をもたらしますが、ユーザーに目に見える変化は生じないはずです。
コンパイラ
このリリースでは、Goコードがunsafe.Pointer
の安全ルールに動的に従っていることを確認するための計測を追加するコンパイル時オプション-d=checkptr
が追加されました。このオプションは、-race
または-msan
フラグと共にデフォルトで有効になっており(Windowsを除く)、-gcflags=all=-d=checkptr=0
で無効にできます。具体的には、-d=checkptr
は以下をチェックします:
unsafe.Pointer
を*T
に変換する際、結果のポインタはT
に適切にアラインされている必要があります。- ポインタ演算の結果がGoヒープオブジェクトを指している場合、
unsafe.Pointer
型のオペランドの1つは同じオブジェクトを指している必要があります。
-d=checkptr
の使用は、標準ライブラリで誤警告を引き起こすため、現在Windowsでは推奨されていません。コンパイラは、インライン化、エスケープ解析、境界チェックの削除、nilチェックの削除などの主要な最適化の機械可読ログを-json
フラグを使用して出力できるようになりました。詳細なエスケープ解析診断(-m=2
)が再び機能するようになりました。これは、前のリリースで新しいエスケープ解析実装から削除されていました。macOSバイナリのすべてのGoシンボルは、プラットフォームの慣例に従ってアンダースコアで始まるようになりました。このリリースには、ファジングのためのコンパイラ挿入カバレッジ計測の実験的サポートが含まれています。詳細については、issue 14565
を参照してください。このAPIは将来のリリースで変更される可能性があります。境界チェックの削除は、スライス作成からの情報を使用し、int
より小さい型のインデックスのチェックを削除できるようになりました。
標準ライブラリ
新しいバイトシーケンスハッシュパッケージ
Go 1.14には、新しいパッケージhash/maphash が含まれており、バイトシーケンスに対するハッシュ関数を提供します。これらのハッシュ関数は、ハッシュテーブルや、任意の文字列やバイトシーケンスを符号なし64ビット整数の均一な分布にマッピングする必要がある他のデータ構造を実装するために使用されることを意図しています。ハッシュ関数は衝突耐性がありますが、暗号的に安全ではありません。特定のバイトシーケンスのハッシュ値は、単一のプロセス内で一貫していますが、異なるプロセスでは異なります。
ライブラリの小さな変更
いつものように、Go 1の互換性の約束 を念頭に置いて、ライブラリにさまざまな小さな変更と更新が行われています。
crypto/tls
SSLバージョン3.0(SSLv3)のサポートが削除されました。SSLv3は、TLSに先立つ暗号的に破られた
プロトコルであることに注意してください。TLS 1.3は、もはやGODEBUG
環境変数を介して無効にすることはできません。TLSバージョンを構成するには、Config.MaxVersion
フィールドを使用してください。複数の証明書チェーンがConfig.Certificates
フィールドを介して提供される場合、ピアと互換性のある最初のものが自動的に選択されるようになりました。これにより、たとえばECDSAとRSAの証明書を提供し、パッケージが最適なものを自動的に選択することができます。この選択のパフォーマンスは、Certificate.Leaf
フィールドが設定されていない限り、低下することに注意してください。単一の証明書を名前に関連付けることのみをサポートするConfig.NameToCertificate
フィールドは、非推奨となり、nil
のままにする必要があります。同様に、リーフ証明書からNameToCertificate
フィールドを構築するConfig.BuildNameToCertificate
メソッドも非推奨となり、呼び出さないでください。新しいCipherSuites
およびInsecureCipherSuites
関数は、現在実装されている暗号スイートのリストを返します。新しいCipherSuiteName
関数は、暗号スイートIDの名前を返します。新しい(*ClientHelloInfo).SupportsCertificate
および(*CertificateRequestInfo).SupportsCertificate
メソッドは、ピアが特定の証明書をサポートしているかどうかを公開します。tls
パッケージは、もはやレガシーな次のプロトコルネゴシエーション(NPN)拡張をサポートせず、ALPNのみをサポートします。以前のリリースでは、両方をサポートしていました。APIの変更はなく、アプリケーションは以前と同様に機能するはずです。他のほとんどのクライアントとサーバーは、すでに標準化されたALPNを支持してNPNサポートを削除しています。TLS 1.2ハンドシェイクでサポートされている場合、RSA-PSS署名が使用されるようになりました。これはほとんどのアプリケーションには影響しませんが、RSA-PSS署名をサポートしていないカスタムCertificate.PrivateKey
実装は、新しいCertificate.SupportedSignatureAlgorithms
フィールドを使用してそれらを無効にする必要があります。Config.Certificates
およびConfig.GetCertificate
は、Config.GetConfigForClient
が設定されている場合、どちらもnil
にすることができます。コールバックが証明書もエラーも返さない場合、unrecognized_name
が送信されるようになりました。新しいCertificateRequestInfo.Version
フィールドは、クライアント証明書コールバックにTLSバージョンを提供します。新しいTLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
およびTLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
定数は、以前にTLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
およびTLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
として参照されていた暗号スイートの最終名を使用します。
crypto/x509
Certificate.CreateCRL
は、Ed25519発行者をサポートするようになりました。
debug/dwarf
debug/dwarf
パッケージは、DWARFバージョン5の読み取りをサポートするようになりました。新しいメソッド(*Data).AddSection
は、入力ファイルからDWARFデータに任意の新しいDWARFセクションを追加することをサポートします。新しいメソッド(*Reader).ByteOrder
は、現在のコンパイルユニットのバイトオーダーを返します。これは、ネイティブオーダーでエンコードされた属性(たとえば、ロケーション記述)を解釈するために使用できます。新しいメソッド(*LineReader).Files
は、ラインリーダーからファイル名テーブルを返します。これは、AttrDeclFile
などのDWARF属性の値を解釈するために使用できます。
encoding/asn1
Unmarshal
は、新しいTagBMPString
定数で表されるASN.1文字列型BMPString
をサポートするようになりました。
encoding/json
Decoder
型は、新しいメソッドInputOffset
をサポートしており、現在のデコーダ位置の入力ストリームバイトオフセットを返します。Compact
はもはやU+2028およびU+2029文字をエスケープしなくなりました。これはドキュメント化された機能ではありませんでした。適切なエスケープについては、HTMLEscape
を参照してください。Number
はもはや無効な数値を受け入れなくなり、ドキュメント化された動作により近づきました。空の文字列のような無効な数値を受け入れる必要があるプログラムは、Unmarshaler
で型をラップすることを検討してください。Unmarshal
は、文字列の基底型を持ち、encoding.TextUnmarshaler
を実装するマップキーをサポートできるようになりました。
go/build
Context
型には、新しいフィールドDir
があり、ビルドの作業ディレクトリを設定するために使用できます。デフォルトは、実行中のプロセスの現在のディレクトリです。モジュールモードでは、これはメインモジュールを見つけるために使用されます。
go/doc
新しい関数NewFromFiles
は、*ast.File
のリストからパッケージドキュメントを計算し、適切なパッケージ要素に例を関連付けます。新しい情報は、Package
、Type
、およびFunc
型の新しいExamples
フィールド、およびExample
型の新しいSuffix
フィールドで利用できます。
io/ioutil
TempDir
は、予測可能なプレフィックスとサフィックスを持つディレクトリを作成できるようになりました。TempFile
と同様に、パターンに'*'
が含まれている場合、ランダムな文字列が最後の'*'
を置き換えます。
log
新しいLmsgprefix
フラグを使用すると、ログ関数にオプションの出力プレフィックスを行の先頭ではなくログメッセージの直前に出力させることができます。
math
新しいFMA
関数は、x*y+z
を浮動小数点で計算し、x*y
計算の中間丸めを行いません。いくつかのアーキテクチャは、この計算を専用のハードウェア命令を使用して実装し、追加のパフォーマンスを提供します。
math/big
GCD
メソッドは、入力a
およびb
がゼロまたは負であることを許可するようになりました。
math/bits
新しい関数Rem
、Rem32
、およびRem64
は、商がオーバーフローする場合でも剰余を計算することをサポートします。
mime
.js
および.mjs
ファイルのデフォルトタイプは、application/javascript
ではなくtext/javascript
になりました。これは、application/javascript
を廃止されたものとして扱うIETFドラフト
に準拠しています。
mime/multipart
新しいReader
メソッドNextRawPart
は、クォート印刷可能データを透過的にデコードせずに次のMIMEパートを取得することをサポートします。
net/http
新しいHeader
メソッドValues
は、正規化されたキーに関連付けられたすべての値を取得するために使用できます。新しいTransport
フィールドDialTLSContext
は、プロキシされていないHTTPSリクエストのTLS接続を作成するためのオプションのダイヤル関数を指定するために使用できます。この新しいフィールドは、非推奨とされるDialTLS
の代わりに使用できます。DialTLS
は引き続き動作しますが、新しいコードはDialTLSContext
を使用する必要があります。これにより、トランスポートは必要なくなった時点でダイヤルをキャンセルできます。Windowsでは、ServeFile
は2GBを超えるファイルを正しく提供するようになりました。
net/http/httptest
新しいServer
フィールドEnableHTTP2
は、テストサーバーでHTTP/2を有効にすることをサポートします。
net/textproto
新しいMIMEHeader
メソッドValues
は、正規化されたキーに関連付けられたすべての値を取得するために使用できます。
net/url
URLの解析が失敗した場合(たとえば、Parse
やParseRequestURI
によって)、結果のError
メッセージは解析できないURLを引用するようになりました。これにより、他の解析エラーとの構造と一貫性が明確になります。
os/signal
Windowsでは、CTRL_CLOSE_EVENT
、CTRL_LOGOFF_EVENT
、およびCTRL_SHUTDOWN_EVENT
イベントは、Control-C
やControl-Break
がsyscall.SIGINT
シグナルを生成するのと同様に、syscall.SIGTERM
シグナルを生成するようになりました。
plugin
plugin
パッケージは、freebsd/amd64
をサポートするようになりました。
reflect
StructOf
は、StructField
要素のPkgPath
フィールドを設定することにより、非公開フィールドを持つ構造体型の作成をサポートするようになりました。
runtime
runtime.Goexit
は、再帰的なpanic/recover
によって中断されなくなりました。macOSでは、SIGPIPEはもはやGoランタイムが初期化される前にインストールされたシグナルハンドラに転送されなくなりました。これは、macOSがSIGPIPEをメインスレッドに配信する
ため、閉じたパイプに書き込んでいるスレッドではなく、必要です。
runtime/pprof
生成されたプロファイルには、インラインマーク用に使用される疑似PCが含まれなくなりました。インライン化された関数のシンボル情報は、pprof
ツールが期待する形式
でエンコードされます。これは、最近のリリースで導入された回帰の修正です。
strconv
NumError
型には、変換が失敗した理由を取得するために使用できるUnwrap
メソッドが追加されました。これにより、NumError
値をerrors.Is
と共に使用して、基になるエラーがstrconv.ErrRange
またはstrconv.ErrSyntax
であるかどうかを確認することができます。
sync
非常に競合するMutex
のロック解除は、Mutex
を待っている次のゴルーチンに直接CPUを譲るようになりました。これにより、高CPU数のマシンで非常に競合するミューテックスのパフォーマンスが大幅に向上します。
testing
testing
パッケージは、テストまたはベンチマークが終了した後に呼び出されるクリーンアップ関数をサポートするようになりました。これは、それぞれT.Cleanup
またはB.Cleanup
を呼び出すことで行われます。
text/template
text/template
パッケージは、関数として使用される括弧付き引数のエラーを正しく報告するようになりました。これは、最も一般的には、{{if (eq .F "a") or (eq .F "b")}}
のような誤ったケースで発生します。これは、{{if or (eq .F "a") (eq .F "b")}}
と書く必要があります。誤ったケースは期待通りに動作せず、今ではcan't give argument to non-function
というエラーで報告されます。JSEscape
は、HTMLコンテキストで誤用された場合の影響を軽減するために、&
および=
文字をエスケープするようになりました。
unicode
unicode
パッケージとシステム全体の関連サポートは、Unicode 11.0からUnicode 12.0
にアップグレードされ、554の新しい文字が追加され、4つの新しいスクリプトと61の新しい絵文字が追加されました。