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

JavaScriptを有効にしてください

前書き

Go 1.11 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.11 Release Notes

次のバージョン:Go1.12のリリースノート(日本語訳)
前のバージョン:Go1.10のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報

Go 1.11の紹介

最新のGoリリースであるバージョン1.11は、Go 1.10 から6か月後に登場しました。変更のほとんどはツールチェーン、ランタイム、ライブラリの実装にあります。いつものように、このリリースはGo 1の互換性の約束 を維持しています。ほとんどすべてのGoプログラムがこれまで通りにコンパイルおよび実行されることを期待しています。

言語の変更

言語仕様に変更はありません。

ポート

Go 1.10のリリースノートで発表されたように 、Go 1.11はOpenBSD 6.2以降、macOS 10.10 Yosemite以降、またはWindows 7以降を必要とし、これらのオペレーティングシステムの以前のバージョンのサポートは削除されました。Go 1.11は、今後のOpenBSD 6.4リリースをサポートしています。OpenBSDカーネルの変更により、古いバージョンのGoはOpenBSD 6.4で動作しません。i386ハードウェア上のNetBSDには既知の問題 があります。レースデテクタはlinux/ppc64leでサポートされるようになり、netbsd/amd64でもある程度サポートされています。NetBSDのレースデテクタサポートには既知の問題 があります。メモリサニタイザ(-msan)はlinux/arm64でサポートされるようになりました。ビルドモードc-sharedc-archiveはfreebsd/amd64でサポートされるようになりました。64ビットMIPSシステムでは、新しい環境変数設定GOMIPS64=hardfloat(デフォルト)およびGOMIPS64=softfloatが、浮動小数点計算にハードウェア命令を使用するかソフトウェアエミュレーションを使用するかを選択します。32ビットシステムでは、環境変数は引き続きGOMIPSです。Go 1.10で追加されたように 。ソフトフロートARMシステム(GOARM=5)では、Goはより効率的なソフトウェア浮動小数点インターフェースを使用するようになりました。これはGoコードには透過的ですが、浮動小数点命令を使用するARMアセンブリはGOARMでガードされていない場合、壊れてしまい、新しいインターフェースに移植する必要があります。新しいインターフェース に移植する必要があります。ARMv7上のGo 1.11は、もはやKUSER_HELPERSで構成されたLinuxカーネルを必要としません。この設定はデフォルトのカーネル構成で有効になっていますが、簡素化された構成では無効になることがあります。

WebAssembly

Go 1.11はWebAssemblyjs/wasm)への実験的なポートを追加しました。現在、Goプログラムは、ゴルーチンのスケジューリング、ガベージコレクション、マップなどのGoランタイムを含む1つのWebAssemblyモジュールにコンパイルされます。その結果、生成されるサイズは最小で約2 MB、圧縮すると500 KBになります。Goプログラムは、新しい実験的なsyscall/js パッケージを使用してJavaScriptを呼び出すことができます。バイナリサイズと他の言語との相互運用性はまだ優先事項ではありませんが、将来のリリースで対処される可能性があります。新しいGOOS値「js」とGOARCH値「wasm」の追加により、*_js.goまたは*_wasm.goという名前のGoファイルは、これらのGOOS/GOARCH値が使用されている場合を除き、Goツールによって無視される ようになります。これらのパターンに一致する既存のファイル名がある場合は、名前を変更する必要があります。詳細はWebAssemblyのWikiページ で確認できます。

RISC-V GOARCH値の予約

メインのGoコンパイラはまだRISC-Vアーキテクチャをサポートしていませんが、Gccgoで使用されている「riscv」および「riscv64」のGOARCH値を予約しました。これにより、*_riscv.goという名前のGoファイルも、これらのGOOS/GOARCH値が使用されている場合を除き、Goツールによって無視される ようになります。

ツール

モジュール、パッケージのバージョン管理、および依存関係管理

Go 1.11は、バージョン管理とパッケージ配布を統合サポートしたGOPATHの代替として「モジュール」という新しい概念 を追加しました。モジュールを使用することで、開発者はもはやGOPATH内で作業する必要がなくなり、バージョン依存情報は明示的でありながら軽量で、ビルドはより信頼性が高く再現性があります。モジュールサポートは実験的と見なされています。詳細はGo 1.11ユーザーからのフィードバックに応じて変更される可能性があり、さらに多くのツールが計画されています。モジュールサポートの詳細が変更される可能性がありますが、Go 1.11を使用してモジュールに変換されたプロジェクトは、Go 1.12以降でも引き続き動作します。モジュールを使用してバグに遭遇した場合は、問題を報告 してください。詳細については、goコマンドのドキュメント を参照してください。

インポートパスの制限

Goモジュールサポートは、コマンドライン操作で@記号に特別な意味を割り当てるため、goコマンドは@記号を含むインポートパスの使用を禁止するようになりました。そのようなインポートパスはgo getでは許可されていなかったため、この制限は他の手段でカスタムGOPATHツリーを構築するユーザーにのみ影響を与える可能性があります。

パッケージの読み込み

新しいパッケージgolang.org/x/tools/go/packages は、Goソースコードのパッケージを見つけて読み込むためのシンプルなAPIを提供します。まだ標準ライブラリの一部ではありませんが、多くのタスクにおいて、モジュールを完全にサポートできないgo/build パッケージを効果的に置き換えます。Goパッケージに関する情報を取得するためにgo list などの外部クエリコマンドを実行するため、BazelBuck などの代替ビルドシステムでも同様に機能する分析ツールの構築が可能です。

ビルドキャッシュの要件

Go 1.11は、Go 1.10で導入されたビルドキャッシュ を無効にするために環境変数GOCACHE=offを設定することをサポートする最後のリリースです。Go 1.12からは、ビルドキャッシュが必須となり、$GOPATH/pkgを排除するためのステップとなります。上記で説明したモジュールとパッケージの読み込みサポートは、すでにビルドキャッシュが有効であることを要求しています。ビルドキャッシュを無効にして問題を回避している場合は、問題を報告 してお知らせください。

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

より多くの関数がデフォルトでインライン化の対象となり、panicを呼び出す関数も含まれます。コンパイラツールチェーンは、行ディレクティブ で列情報をサポートするようになりました。新しいパッケージエクスポートデータ形式が導入されました。これはエンドユーザーには透過的であるべきですが、大規模なGoプロジェクトのビルド時間を短縮します。問題が発生した場合は、バイナリをビルドする際に-gcflags=all=-iexport=falsegoツールに渡すことで再度無効にできます。コンパイラは、型スイッチガードで宣言された未使用の変数を拒否するようになりました。たとえば、次の例のxです:

go
1
2
3
4
func f(v interface{}) {
    switch x := v.(type) {
    }
}

これはすでにgccgogo/types によって拒否されていました。

アセンブラ

amd64用のアセンブラはAVX512命令を受け入れるようになりました。

デバッグ

コンパイラは、最適化されたバイナリに対して、変数の位置情報、行番号、ブレークポイントの位置を含む、はるかに正確なデバッグ情報を生成するようになりました。これにより、-N -lなしでコンパイルされたバイナリをデバッグすることが可能になります。デバッグ情報の品質にはまだ制限がありますが、その一部は基本的なものであり、一部は将来のリリースで改善され続けます。DWARFセクションは、コンパイラによって生成された拡張されたより正確なデバッグ情報のため、デフォルトで圧縮されるようになりました。これはほとんどのELFツール(Linuxや*BSDのデバッガーなど)には透過的であり、すべてのプラットフォームでDelveデバッガーによってサポートされていますが、macOSおよびWindowsのネイティブツールではサポートが限られています。DWARF圧縮を無効にするには、バイナリをビルドする際に-ldflags=-compressdwarf=falsegoツールに渡します。Go 1.11は、デバッガー内からGo関数を呼び出すための実験的なサポートを追加しました。これは、たとえば、ブレークポイントで一時停止しているときにStringメソッドを呼び出すのに便利です。これは現在、Delve(バージョン1.1.0以降)でのみサポートされています。

テスト

Go 1.10以降、go testコマンドは、テストを実行する前にパッケージを型チェックするためにgo vetを実行します。vetgo/types を使用してコードを型チェックするため、型チェックに失敗するテストは失敗します。特に、Go 1.10でコンパイルされたクロージャ内に未使用の変数を含むテストは、Goコンパイラがそれらを誤って受け入れたため(Issue #3059 )、go/typesがこの場合に「未使用の変数」エラーを正しく報告するため、今後は失敗します。go test-memprofileフラグは、テスト開始以降に割り当てられた総バイト数(ガベージコレクションされたバイトを含む)を記録する「allocs」プロファイルをデフォルトとするようになりました。

Vet

go vet コマンドは、解析対象のパッケージが型チェックに失敗した場合に致命的なエラーを報告するようになりました。以前は、型チェックエラーが警告を表示し、vetがステータス1で終了するだけでした。さらに、go vet は、printfラッパーのフォーマットチェック時により堅牢になりました。vetは次の例の間違いを検出します:

go
1
2
3
4
5
6
7
func wrapper(s string, args ...interface{}) {
    fmt.Printf(s, args...)
}

func main() {
    wrapper("%s", 42)
}

トレース

新しいruntime/traceパッケージのユーザー注釈API を使用して、ユーザーは実行トレースにアプリケーションレベルの情報を記録し、関連するゴルーチンのグループを作成できます。go tool traceコマンドは、トレースビューと新しいユーザータスク/リージョン分析ページでこの情報を視覚化します。

Cgo

Go 1.10以降、cgoは一部のCポインタ型をGo型uintptrに変換しています。これらの型には、DarwinのCoreFoundationフレームワークのCFTypeRef階層やJavaのJNIインターフェースのjobject階層が含まれます。Go 1.11では、これらの型を検出するコードにいくつかの改善が加えられました。これらの型を使用するコードは、いくつかの更新が必要になる場合があります。詳細はGo 1.10のリリースノート を参照してください。

Goコマンド

環境変数GOFLAGSを使用して、goコマンドのデフォルトフラグを設定できるようになりました。これは特定の状況で便利です。DWARFのため、低性能のシステムではリンクが著しく遅くなることがあり、ユーザーはデフォルトで-ldflags=-wを設定したい場合があります。モジュールの場合、一部のユーザーやCIシステムは常にベンダリングを希望するため、デフォルトで-mod=vendorを設定する必要があります。詳細については、goコマンドのドキュメント を参照してください。

Godoc

Go 1.11は、godocのコマンドラインインターフェースをサポートする最後のリリースです。将来のリリースでは、godocはWebサーバーのみになります。ユーザーは代わりにgo docを使用してコマンドラインヘルプ出力を取得する必要があります。godoc Webサーバーは、新しいAPI機能を導入したGoのバージョンを表示するようになりました。型、関数、メソッドの初期Goバージョンは右揃えで表示されます。たとえば、UserCacheDir を参照してください。右側に「1.11」と表示されています。構造体フィールドの場合、構造体フィールドが型自体が導入されたときとは異なるGoバージョンで追加された場合、インラインコメントが追加されます。構造体フィールドの例については、ClientTrace.Got1xxResponse を参照してください。

Gofmt

Goソースコードのデフォルトのフォーマットの1つの細かい詳細が変更されました。インラインコメントを含む式リストをフォーマットする際、コメントはヒューリスティックに従って整列されていました。しかし、場合によっては整列が簡単に分割されたり、余分な空白が導入されたりすることがありました。ヒューリスティックは、人間が書いたコードに対してより良く動作するように変更されました。これらの種類のgofmtの小さな更新は、時折発生することが予想されます。一般に、Goソースコードの一貫したフォーマットが必要なシステムは、特定のバージョンのgofmtバイナリを使用する必要があります。go/format パッケージのドキュメントを参照してください。

実行

go run コマンドは、単一のインポートパス、ディレクトリ名、または単一のパッケージに一致するパターンを許可するようになりました。これにより、go run pkggo run dir、最も重要なのはgo run .が可能になります。

ランタイム

ランタイムはスパースヒープレイアウトを使用するようになったため、Goヒープのサイズに制限がなくなりました(以前は512GiBの制限がありました)。これにより、混合Go/Cバイナリや-raceでコンパイルされたバイナリでのまれな「アドレス空間の競合」エラーも修正されます。macOSおよびiOSでは、ランタイムはカーネルに直接呼び出す代わりにlibSystem.dylibを使用するようになりました。これにより、Goバイナリは将来のmacOSおよびiOSバージョンとより互換性があるようになります。syscall パッケージはまだ直接システムコールを行っています。これを修正することは将来のリリースで計画されています。

パフォーマンス

いつものように、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な声明を出すことは難しいです。ほとんどのプログラムは、生成されたコードの改善とコアライブラリの最適化により、少し速く実行されるはずです。math/bigパッケージには複数のパフォーマンス変更があり、GOARCH=arm64に特化した多くの変更もあります。

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

コンパイラは、次の形式のマップクリア操作を最適化するようになりました:

go
1
2
3
for k := range m {
    delete(m, k)
}

コンパイラは、次の形式のスライス拡張を最適化するようになりました:

go
1
append(s, make([]T, n)...)

コンパイラは、境界チェックと分岐の除去を大幅に強化しました。特に、推移的関係を認識するようになり、ijがある場合、これらの事実を使用してs[i]の境界チェックを除去できます。また、s[i-10]のような単純な算術を理解し、ループ内のより多くの帰納的ケースを認識できます。さらに、コンパイラは境界情報を使用してシフト操作をより積極的に最適化します。

標準ライブラリ

標準ライブラリへの変更はすべて小さなものです。

ライブラリの小さな変更

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

crypto

ecdsa.Signrsa.EncryptPKCS1v15rsa.GenerateKey を含む特定の暗号操作は、テストが内部動作に依存しないように、ランダム性の余分なバイトをランダムに読み取るようになりました。

crypto/cipher

新しい関数NewGCMWithTagSize は、既存の暗号システムとの互換性のために非標準のタグ長を持つガロアカウンターモードを実装します。

crypto/rsa

PublicKey は、モジュラスサイズをバイト単位で返すSize メソッドを実装するようになりました。

crypto/tls

ConnectionState の新しいExportKeyingMaterial メソッドは、RFC 5705に従って接続にバインドされたキーイングマテリアルをエクスポートすることを可能にします。

crypto/x509

CommonNameフィールドをSubject Alternative Namesが存在しない場合にホスト名として扱うという非推奨のレガシー動作は、CNが有効なホスト名でない場合に無効になりました。CommonNameを完全に無視するには、実験的な値x509ignoreCN=1GODEBUG環境変数に追加します。CNが無視されると、SANのない証明書はNameConstraintsWithoutSANsを返す代わりに、名前制約を持つチェーンの下で検証されます。拡張キー使用制限は、VerifyOptions のKeyUsagesフィールドに表示される場合にのみ再びチェックされるようになり、常にチェックされるわけではありません。これはGo 1.9およびそれ以前の動作と一致します。SystemCertPool によって返される値はキャッシュされ、呼び出し間でシステムの変更を反映しない場合があります。

debug/elf

より多くのELFOSABI およびEM 定数が追加されました。

encoding/asn1

MarshalおよびUnmarshal は、フィールドの「プライベート」クラス注釈をサポートするようになりました。

encoding/base32

デコーダーは、未完成のチャンクに対して一貫してio.ErrUnexpectedEOFを返すようになりました。以前は、場合によってはio.EOFを返していました。

encoding/csv

リーダーは、Comma フィールドをダブルクォート文字に設定しようとする試みを拒否するようになりました。ダブルクォート文字はすでにCSVで特別な意味を持っているためです。

html/template

パッケージは、型付きインターフェース値が暗黙のエスケーパ関数に渡されたときの動作を変更しました。以前は、そのような値は(エスケープされた形式の)として書き出されていました。今では、そのような値は無視されます。これは、型なしのnil値が無視される(常に無視されてきた)ように無視されます。

image/gif

ループしないアニメーションGIFがサポートされるようになりました。それらはLoopCountが-1であることによって示されます。

io/ioutil

TempFile 関数は、ファイル名のランダム文字が配置される場所を指定することをサポートするようになりました。プレフィックス引数に「*」が含まれている場合、ランダム文字列は「*」を置き換えます。たとえば、プレフィックス引数が「myname.*.bat」の場合、ランダムなファイル名は「myname.123456.bat」のようになります。「*」が含まれていない場合、古い動作が保持され、ランダムな数字が末尾に追加されます。

math/big

ModInverse は、gnが互いに素でない場合にnilを返すようになりました。結果は以前は未定義でした。

mime/multipart

ファイル名が欠落している/空のフォームデータの処理は、Go 1.9の動作に戻されました:フォームデータ部分のForm では、値はValueフィールドにあり、Fileフィールドにはありません。Goリリース1.10から1.10.3では、ファイル名が欠落している/空で「Content-Type」フィールドが空でないフォームデータ部分はFileフィールドに格納されていました。この変更は1.10での誤りであり、1.9の動作に戻されました。

mime/quotedprintable

野生で見つかった無効な入力をサポートするために、パッケージは非ASCIIバイトを許可するようになりましたが、それらのエンコーディングを検証しません。

net

新しいListenConfig 型と新しいDialer.Control フィールドは、それぞれ接続を受け入れる前と作成する前にソケットオプションを設定することを許可します。syscall.RawConnReadおよびWriteメソッドは、Windowsで正しく動作するようになりました。netパッケージは、LinuxでTCPConn.ReadFrom でデータをコピーする際に、spliceシステムコール を自動的に使用するようになりました。これにより、より高速で効率的なTCPプロキシが実現されます。TCPConn.FileUDPConn.FileUnixConn.File 、およびIPConn.File メソッドは、返された*os.Fileをブロッキングモードにしなくなりました。

net/http

Transport 型には、ホストごとの最大接続数を制限することを許可する新しいMaxConnsPerHost オプションがあります。Cookie 型には、新しいクッキー属性を表す新しいSameSite フィールド(新しい型も同じ名前のSameSite )があります。net/httpTransportSameSite属性自体を使用しませんが、パッケージはブラウザが使用するために属性の解析とシリアル化をサポートしています。Server を再利用することは、Shutdown またはClose の呼び出し後には許可されなくなりました。過去には公式にサポートされておらず、しばしば驚くべき動作をしていました。今後、サーバーのServeメソッドへのすべての呼び出しは、シャットダウンまたはクローズ後にエラーを返します。定数StatusMisdirectedRequestは、HTTPステータスコード421のために定義されるようになりました。HTTPサーバーは、パイプライン化されたHTTP/1.1リクエストを受信した際に、コンテキストをキャンセルしたり、CloseNotifier チャネルに送信したりしなくなりました。ブラウザはHTTPパイプラインを使用しませんが、一部のクライアント(たとえばDebianのapt)はそれを使用するように設定されている場合があります。ProxyFromEnvironment は、DefaultTransport で使用され、NO_PROXY環境変数でCIDR表記とポートをサポートするようになりました。

net/http/httputil

ReverseProxy には、エラーの処理方法を変更することを許可する新しいErrorHandler オプションがあります。ReverseProxyは、gRPCプロトコルで要求されるように、「TE: trailers」リクエストヘッダーをバックエンドに渡すようになりました。

os

新しいUserCacheDir 関数は、ユーザー固有のキャッシュデータに使用するデフォルトのルートディレクトリを返します。新しいModeIrregular は、ファイルが通常のファイルではないが、それ以外のことは知られていない、またはGoが定義したモードビットを持つソケット、デバイス、名前付きパイプ、シンボリックリンク、または他のファイルタイプではないことを表すFileMode ビットです。Symlink は、開発者モードが有効になっているマシンのWindows 10で非特権ユーザーが使用できるようになりました。ノンブロッキングディスクリプタがNewFile に渡されると、結果の*Fileはノンブロッキングモードのままになります。これにより、その*FileのI/Oは別のスレッドではなくランタイムポーラーを使用し、SetDeadline メソッドが機能するようになります。

os/signal

新しいIgnored 関数は、シグナルが現在無視されているかどうかを報告します。

os/user

os/userパッケージは、環境変数CGO_ENABLED=0の使用とは無関係に、「osusergo」ビルドタグを使用して純粋なGoモードでビルドできるようになりました。以前は、パッケージの純粋なGo実装を使用する唯一の方法は、プログラム全体でcgoサポートを無効にすることでした。

runtime

環境変数GODEBUG=tracebackancestors=Nを設定すると、ゴルーチンが作成されたスタックでトレースバックが拡張されるようになり、Nは報告する祖先ゴルーチンの数を制限します。

runtime/pprof

このリリースでは、プログラム開始以降に割り当てられた総バイト数(ガベージコレクションされたバイトを含む)をプロファイルする新しい「allocs」プロファイルタイプが追加されました。これは、-alloc_spaceモードで表示される既存の「heap」プロファイルと同じです。今後、go test -memprofile=...は「heap」プロファイルではなく「allocs」プロファイルを報告します。

sync

ミューテックスプロファイルには、RWMutex のリーダー/ライター競合が含まれるようになりました。ライター/ライター競合はすでにミューテックスプロファイルに含まれていました。

syscall

Windowsでは、いくつかのフィールドがuintptrから新しいPointer 型に変更され、Goのガベージコレクタの問題を回避しました。同じ変更がgolang.org/x/sys/windows パッケージにも行われました。影響を受けるコードについては、まずsyscallパッケージからgolang.org/x/sys/windowsパッケージに移行し、次にunsafe.Pointer変換ルール に従ってPointerを使用するように変更する必要があります。Linuxでは、Faccessat のフラグパラメータは、glibcと同様に実装されるようになりました。以前のGoリリースでは、フラグパラメータは無視されていました。Linuxでは、Fchmodat のフラグパラメータが検証されるようになりました。Linuxのfchmodatはフラグパラメータをサポートしていないため、glibcの動作を模倣し、非ゼロの場合はエラーを返すようになりました。

text/scanner

Scanner.Scan メソッドは、String ではなくRawString トークンを生の文字列リテラルに対して返すようになりました。

text/template

テンプレート変数を=トークンを使用して変更することが許可されるようになりました:

go
1
2
3
4
5
{{ $v := "init" }}
{{ if true }}
  {{ $v = "changed" }}
{{ end }}
v: {{ $v }} {{/* "changed" */}}

以前のバージョンでは、テンプレート関数に渡された型なしのnil値は無視されていました。これらは通常の引数として渡されるようになりました。

time

符号とオフセットで示されるタイムゾーンの解析がサポートされるようになりました。以前のバージョンでは、数値のタイムゾーン名(たとえば+03)は有効と見なされず、タイムゾーン名を期待する場合は3文字の略語(たとえばMST)のみが受け入れられていました。


スポンサーリンク

共有

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