前書き
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-shared
とc-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はWebAssembly
(js/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 などの外部クエリコマンドを実行するため、Bazel やBuck などの代替ビルドシステムでも同様に機能する分析ツールの構築が可能です。
ビルドキャッシュの要件
Go 1.11は、Go 1.10で導入されたビルドキャッシュ
を無効にするために環境変数GOCACHE=off
を設定することをサポートする最後のリリースです。Go 1.12からは、ビルドキャッシュが必須となり、$GOPATH/pkgを排除するためのステップとなります。上記で説明したモジュールとパッケージの読み込みサポートは、すでにビルドキャッシュが有効であることを要求しています。ビルドキャッシュを無効にして問題を回避している場合は、問題を報告
してお知らせください。
コンパイラツールチェーン
より多くの関数がデフォルトでインライン化の対象となり、panic
を呼び出す関数も含まれます。コンパイラツールチェーンは、行ディレクティブ
で列情報をサポートするようになりました。新しいパッケージエクスポートデータ形式が導入されました。これはエンドユーザーには透過的であるべきですが、大規模なGoプロジェクトのビルド時間を短縮します。問題が発生した場合は、バイナリをビルドする際に-gcflags=all=-iexport=false
をgo
ツールに渡すことで再度無効にできます。コンパイラは、型スイッチガードで宣言された未使用の変数を拒否するようになりました。たとえば、次の例のx
です:
|
|
これはすでにgccgo
とgo/types
によって拒否されていました。
アセンブラ
amd64用のアセンブラはAVX512命令を受け入れるようになりました。
デバッグ
コンパイラは、最適化されたバイナリに対して、変数の位置情報、行番号、ブレークポイントの位置を含む、はるかに正確なデバッグ情報を生成するようになりました。これにより、-N -l
なしでコンパイルされたバイナリをデバッグすることが可能になります。デバッグ情報の品質にはまだ制限がありますが、その一部は基本的なものであり、一部は将来のリリースで改善され続けます。DWARFセクションは、コンパイラによって生成された拡張されたより正確なデバッグ情報のため、デフォルトで圧縮されるようになりました。これはほとんどのELFツール(Linuxや*BSDのデバッガーなど)には透過的であり、すべてのプラットフォームでDelveデバッガーによってサポートされていますが、macOSおよびWindowsのネイティブツールではサポートが限られています。DWARF圧縮を無効にするには、バイナリをビルドする際に-ldflags=-compressdwarf=false
をgo
ツールに渡します。Go 1.11は、デバッガー内からGo関数を呼び出すための実験的なサポートを追加しました。これは、たとえば、ブレークポイントで一時停止しているときにString
メソッドを呼び出すのに便利です。これは現在、Delve(バージョン1.1.0以降)でのみサポートされています。
テスト
Go 1.10以降、go test
コマンドは、テストを実行する前にパッケージを型チェックするためにgo vet
を実行します。vet
はgo/types
を使用してコードを型チェックするため、型チェックに失敗するテストは失敗します。特に、Go 1.10でコンパイルされたクロージャ内に未使用の変数を含むテストは、Goコンパイラがそれらを誤って受け入れたため(Issue #3059
)、go/types
がこの場合に「未使用の変数」エラーを正しく報告するため、今後は失敗します。go test
の-memprofile
フラグは、テスト開始以降に割り当てられた総バイト数(ガベージコレクションされたバイトを含む)を記録する「allocs」プロファイルをデフォルトとするようになりました。
Vet
go vet
コマンドは、解析対象のパッケージが型チェックに失敗した場合に致命的なエラーを報告するようになりました。以前は、型チェックエラーが警告を表示し、vet
がステータス1で終了するだけでした。さらに、go vet
は、printf
ラッパーのフォーマットチェック時により堅牢になりました。vet
は次の例の間違いを検出します:
|
|
トレース
新しい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 pkg
やgo run dir
、最も重要なのはgo run .
が可能になります。
ランタイム
ランタイムはスパースヒープレイアウトを使用するようになったため、Goヒープのサイズに制限がなくなりました(以前は512GiBの制限がありました)。これにより、混合Go/Cバイナリや-race
でコンパイルされたバイナリでのまれな「アドレス空間の競合」エラーも修正されます。macOSおよびiOSでは、ランタイムはカーネルに直接呼び出す代わりにlibSystem.dylib
を使用するようになりました。これにより、Goバイナリは将来のmacOSおよびiOSバージョンとより互換性があるようになります。syscall
パッケージはまだ直接システムコールを行っています。これを修正することは将来のリリースで計画されています。
パフォーマンス
いつものように、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な声明を出すことは難しいです。ほとんどのプログラムは、生成されたコードの改善とコアライブラリの最適化により、少し速く実行されるはずです。math/big
パッケージには複数のパフォーマンス変更があり、GOARCH=arm64に特化した多くの変更もあります。
コンパイラツールチェーン
コンパイラは、次の形式のマップクリア操作を最適化するようになりました:
|
|
コンパイラは、次の形式のスライス拡張を最適化するようになりました:
|
|
コンパイラは、境界チェックと分岐の除去を大幅に強化しました。特に、推移的関係を認識するようになり、i
とj
がある場合、これらの事実を使用してs[i]
の境界チェックを除去できます。また、s[i-10]
のような単純な算術を理解し、ループ内のより多くの帰納的ケースを認識できます。さらに、コンパイラは境界情報を使用してシフト操作をより積極的に最適化します。
標準ライブラリ
標準ライブラリへの変更はすべて小さなものです。
ライブラリの小さな変更
いつものように、Go 1の互換性の約束 を念頭に置いて、ライブラリにさまざまな小さな変更と更新が行われています。
crypto
ecdsa.Sign 、rsa.EncryptPKCS1v15 、rsa.GenerateKey を含む特定の暗号操作は、テストが内部動作に依存しないように、ランダム性の余分なバイトをランダムに読み取るようになりました。
crypto/cipher
新しい関数NewGCMWithTagSize は、既存の暗号システムとの互換性のために非標準のタグ長を持つガロアカウンターモードを実装します。
crypto/rsa
PublicKey は、モジュラスサイズをバイト単位で返すSize メソッドを実装するようになりました。
crypto/tls
ConnectionState の新しいExportKeyingMaterial メソッドは、RFC 5705に従って接続にバインドされたキーイングマテリアルをエクスポートすることを可能にします。
crypto/x509
CommonNameフィールドをSubject Alternative Namesが存在しない場合にホスト名として扱うという非推奨のレガシー動作は、CNが有効なホスト名でない場合に無効になりました。CommonNameを完全に無視するには、実験的な値x509ignoreCN=1
をGODEBUG
環境変数に追加します。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
は、g
とn
が互いに素でない場合に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.RawConn
のRead
およびWrite
メソッドは、Windowsで正しく動作するようになりました。net
パッケージは、LinuxでTCPConn.ReadFrom
でデータをコピーする際に、spliceシステムコール
を自動的に使用するようになりました。これにより、より高速で効率的なTCPプロキシが実現されます。TCPConn.File
、UDPConn.File
、UnixConn.File
、およびIPConn.File
メソッドは、返された*os.File
をブロッキングモードにしなくなりました。
net/http
Transport
型には、ホストごとの最大接続数を制限することを許可する新しいMaxConnsPerHost
オプションがあります。Cookie
型には、新しいクッキー属性を表す新しいSameSite
フィールド(新しい型も同じ名前のSameSite
)があります。net/http
のTransport
はSameSite
属性自体を使用しませんが、パッケージはブラウザが使用するために属性の解析とシリアル化をサポートしています。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
テンプレート変数を=
トークンを使用して変更することが許可されるようになりました:
|
|
以前のバージョンでは、テンプレート関数に渡された型なしのnil
値は無視されていました。これらは通常の引数として渡されるようになりました。
time
符号とオフセットで示されるタイムゾーンの解析がサポートされるようになりました。以前のバージョンでは、数値のタイムゾーン名(たとえば+03
)は有効と見なされず、タイムゾーン名を期待する場合は3文字の略語(たとえばMST
)のみが受け入れられていました。