Go1.14のリリースノート(日本語訳)

JavaScriptを有効にしてください

前書き

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には、IsUndefinedIsNull、およびIsNaNメソッドが追加されました。

RISC-V

Go 1.14には、Linux上での64ビットRISC-V(GOOS=linuxGOARCH=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 buildgo 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/armdarwin/armjs/wasm、および plan9/* を除くすべてのプラットフォームでサポートされています。

プリエンプションの実装の結果、Linux や macOS を含む Unix 系システムでは、Go 1.14 でビルドされたプログラムが、以前のリリースでビルドされたプログラムよりも多くのシグナルを受け取るようになります。これは、syscallgolang.org/x/sys/unix といったパッケージを使用するプログラムで、遅いシステムコールがより多く EINTR エラーで失敗することを意味します。これらのプログラムは、エラーに対して何らかの対処(おそらくシステムコールを再試行するループ処理)を実装する必要があります。詳しくは、Linux システムの場合は man 7 signal 、その他のシステムでは同様のドキュメントを参照してください。

ページアロケータはより効率的になり、GOMAXPROCS の値が高い場合でもロック競合が大幅に減少しました。特に、大量のメモリアロケーションが並行して高速に行われる状況で、低レイテンシと高スループットが実現されています。

また、time.Aftertime.Ticknet.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のリストからパッケージドキュメントを計算し、適切なパッケージ要素に例を関連付けます。新しい情報は、PackageType、およびFunc型の新しいExamplesフィールド、およびExample型の新しいSuffixフィールドで利用できます。

io/ioutil

TempDirは、予測可能なプレフィックスとサフィックスを持つディレクトリを作成できるようになりました。TempFileと同様に、パターンに'*'が含まれている場合、ランダムな文字列が最後の'*'を置き換えます。

log

新しいLmsgprefixフラグを使用すると、ログ関数にオプションの出力プレフィックスを行の先頭ではなくログメッセージの直前に出力させることができます。

math

新しいFMA関数は、x*y+zを浮動小数点で計算し、x*y計算の中間丸めを行いません。いくつかのアーキテクチャは、この計算を専用のハードウェア命令を使用して実装し、追加のパフォーマンスを提供します。

math/big

GCDメソッドは、入力aおよびbがゼロまたは負であることを許可するようになりました。

math/bits

新しい関数RemRem32、および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の解析が失敗した場合(たとえば、ParseParseRequestURIによって)、結果のErrorメッセージは解析できないURLを引用するようになりました。これにより、他の解析エラーとの構造と一貫性が明確になります。

os/signal

Windowsでは、CTRL_CLOSE_EVENTCTRL_LOGOFF_EVENT、およびCTRL_SHUTDOWN_EVENTイベントは、Control-CControl-Breaksyscall.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の新しい絵文字が追加されました。


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア