前書き
Go 1.12 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.12 Release Notes
次のバージョン:Go1.13のリリースノート(日本語訳)
前のバージョン:Go1.11のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.12の紹介
最新のGoリリースであるバージョン1.12は、Go 1.11 から6か月後に登場しました。変更のほとんどは、ツールチェーン、ランタイム、およびライブラリの実装にあります。いつものように、このリリースはGo 1の互換性の約束 を維持しています。ほとんどすべてのGoプログラムがこれまで通りにコンパイルおよび実行されることを期待しています。
言語の変更
言語仕様に変更はありません。
ポート
レースデテクタがlinux/arm64でサポートされるようになりました。Go 1.12はFreeBSD 10.xでサポートされる最後のリリースであり、すでにサポート終了に達しています。Go 1.13ではFreeBSD 11.2+またはFreeBSD 12.0+が必要になります。FreeBSD 12.0+では、COMPAT_FREEBSD11オプションが設定されたカーネルが必要です(これはデフォルトです)。cgoはlinux/ppc64でサポートされるようになりました。hurdはGOOSの認識された値として、GNU/Hurdシステムでgccgoと共に使用するために予約されています。
Windows
Goの新しいwindows/armポートは、Raspberry Pi 3などの32ビットARMチップ上でWindows 10 IoT Core上でGoを実行することをサポートしています。
AIX
Goは現在、POWER8アーキテクチャ(aix/ppc64)上のAIX 7.2以降をサポートしています。外部リンク、cgo、pprof、およびレースデテクタはまだサポートされていません。
Darwin
Go 1.12はmacOS 10.10 Yosemiteで実行される最後のリリースです。Go 1.13ではmacOS 10.11 El Capitan以降が必要になります。libSystemは現在、Darwinでのシステムコールを行う際に使用されており、将来のmacOSおよびiOSバージョンとの前方互換性を確保しています。libSystemへの切り替えにより、プライベートAPI使用のための追加のApp Storeチェックがトリガーされました。プライベートと見なされるため、syscall.Getdirentries
はiOSで常にENOSYS
で失敗します。さらに、syscall.Setrlimit
は、歴史的に成功していた場所で無効な引数を報告します。これらの結果はGoに特有のものではなく、ユーザーは今後libSystemの実装と同等の動作を期待すべきです。
ツール
go tool vet はサポートされなくなりました
go vet
コマンドは、さまざまなソースコード分析ツールの基盤として機能するように書き直されました。詳細については、golang.org/x/tools/go/analysis
パッケージを参照してください。その副作用として、go tool vet
はサポートされなくなりました。go tool vet
を使用する外部ツールは、go vet
を使用するように変更する必要があります。go tool vet
の代わりにgo vet
を使用することは、サポートされているすべてのGoバージョンで動作するはずです。この変更の一環として、実験的な-shadow
オプションはgo vet
で利用できなくなりました。変数のシャドウイングをチェックするには、次のコマンドを使用します。
|
|
ツアー
Goツアーはメインのバイナリ配布に含まれなくなりました。ローカルでツアーを実行するには、go tool tour
を実行する代わりに、手動でインストールしてください。
|
|
ビルドキャッシュの要件
ビルドキャッシュ
は、$GOPATH/pkg
を排除するためのステップとして現在必須です。環境変数GOCACHE=off
を設定すると、キャッシュに書き込むgo
コマンドが失敗します。
バイナリのみのパッケージ
Go 1.12はバイナリのみのパッケージをサポートする最後のリリースです。
Cgo
Go 1.12はCタイプEGLDisplay
をGoタイプuintptr
に変換します。この変更は、Go 1.10以降がDarwinのCoreFoundationおよびJavaのJNIタイプをどのように扱うかに似ています。詳細については、cgoドキュメント
を参照してください。Cgoを使用するパッケージでは、マングルされたC名はもはや受け入れられません。代わりにCgo名を使用してください。たとえば、Cgoが生成するマングルされた名前_Ctype_char
の代わりに、ドキュメント化されたCgo名C.char
を使用してください。
モジュール
GO111MODULE
がon
に設定されている場合、go
コマンドは現在のディレクトリに相対的なインポートパスを解決する必要がないか、go.mod
ファイルを明示的に編集する必要がない限り、モジュールディレクトリ外でのモジュール対応操作をサポートします。go get
、go list
、およびgo mod download
などのコマンドは、最初は空の要件を持つモジュール内にいるかのように動作します。このモードでは、go env GOMOD
はシステムのヌルデバイス(/dev/null
またはNUL
)を報告します。モジュールをダウンロードして抽出するgo
コマンドは、現在同時に呼び出しても安全です。モジュールキャッシュ(GOPATH/pkg/mod
)は、ファイルロックをサポートするファイルシステムに存在する必要があります。go.mod
ファイルのgo
ディレクティブは、モジュール内のファイルで使用される言語のバージョンを示します。既存のバージョンが存在しない場合、現在のリリース(go 1.12
)に設定されます。モジュールのgo
ディレクティブが使用中のツールチェーンより新しいバージョンを指定している場合、go
コマンドはパッケージのビルドを試み、ビルドが失敗した場合にのみ不一致を通知します。このgo
ディレクティブの使用変更により、Go 1.12を使用してモジュールをビルドし、go.mod
ファイルにgo 1.12
を記録すると、Go 1.11からGo 1.11.3までの同じモジュールをビルドしようとするとエラーが発生します。Go 1.11.4以降およびGo 1.11より古いリリースは問題なく動作します。Go 1.11から1.11.3を使用する必要がある場合は、Go 1.12のgo
ツールを使用して、go mod edit -go=1.11
を介して言語バージョンを1.11に設定することで問題を回避できます。インポートがアクティブなモジュールを使用して解決できない場合、go
コマンドはモジュールキャッシュおよび通常のネットワークソースを参照する前に、メインモジュールのreplace
ディレクティブで言及されているモジュールを使用しようとします。一致する置換が見つかったがreplace
ディレクティブがバージョンを指定していない場合、go
コマンドはゼロのtime.Time
から派生した疑似バージョン(例:v0.0.0-00010101000000-000000000000
)を使用します。
コンパイラツールチェーン
コンパイラのライブ変数解析が改善されました。これにより、このリリースでは以前のリリースよりも早くファイナライザが実行される可能性があります。それが問題である場合は、適切なruntime.KeepAlive 呼び出しを追加することを検討してください。より多くの関数がデフォルトでインライン化の対象となり、他の関数を呼び出すだけの関数も含まれます。この追加のインライン化により、runtime.CallersFrames を使用することがさらに重要になります。これは、runtime.Callers の結果を直接反復する代わりに使用します。
|
|
メソッド式を実装するためにコンパイラによって生成されたラッパーは、もはやruntime.CallersFrames
およびruntime.Stack
によって報告されません。また、パニックスタックトレースにも印刷されません。この変更により、gcツールチェーンがgccgoツールチェーンと一致し、スタックトレースからそのようなラッパーをすでに省略していました。これらのAPIのクライアントは、欠落しているフレームに調整する必要があるかもしれません。1.11と1.12のリリース間で相互運用する必要があるコードの場合、メソッド式x.M
を関数リテラルfunc (...) { x.M(...) }
に置き換えることができます。コンパイラは現在、使用するGo言語バージョンを設定するための-lang
フラグを受け入れます。たとえば、-lang=go1.8
は、Go 1.9で追加された型エイリアスを使用するプログラムにエラーを発生させます。Go 1.12以前に行われた言語変更は一貫して強制されていません。コンパイラツールチェーンは現在、Go関数とアセンブリ関数を呼び出すための異なる規約を使用しています。これはユーザーには見えないはずですが、Goとアセンブリ間を同時に横断し、パッケージ境界を越える呼び出しを除きます。リンクが「ABIInternalのために定義されていないリロケーションターゲット(ただしABI0のために定義されている)」のようなエラーを引き起こす場合は、ABI設計ドキュメントの互換性セクション
を参照してください。コンパイラによって生成されるDWARFデバッグ情報には多くの改善があり、引数の印刷や変数の位置情報の改善が含まれています。Goプログラムは現在、linux/arm64上でスタックフレームポインタを維持しており、perf
のようなプロファイリングツールに役立ちます。フレームポインタの維持には小さなランタイムオーバーヘッドがあり、変動しますが平均して約3%です。フレームポインタを使用しないツールチェーンをビルドするには、make.bash
を実行するときにGOEXPERIMENT=noframepointer
を設定します。廃止された「安全」コンパイラモード(-u gcflag
で有効)は削除されました。
godoc と go doc
Go 1.12では、godoc
はもはやコマンドラインインターフェースを持たず、ウェブサーバーのみです。ユーザーはコマンドラインヘルプ出力のためにgo doc
を使用するべきです。Go 1.12はgodoc
ウェブサーバーを含む最後のリリースであり、Go 1.13ではgo get
を介して利用可能になります。go doc
は現在-all
フラグをサポートしており、これによりすべてのエクスポートされたAPIとそのドキュメントが印刷されます。これは以前のgodoc
コマンドラインが行っていたことです。go doc
にはターゲットのソースコードを表示する-src
フラグも含まれています。
トレース
トレースツールは現在、実行トレースへのクロスリファレンスを含むミューテータ利用曲線のプロットをサポートしています。これらは、ガベージコレクタがアプリケーションのレイテンシとスループットに与える影響を分析するのに役立ちます。
アセンブラ
arm64では、プラットフォームレジスタがR18
からR18_PLATFORM
に名前が変更され、誤って使用されるのを防ぎます。OSはこのレジスタを予約することを選択できます。
ランタイム
Go 1.12は、ヒープの大部分がライブのままである場合のスイープのパフォーマンスを大幅に改善しました。これにより、ガベージコレクション直後の割り当てレイテンシが低下します。Goランタイムは現在、特に既存のヒープスペースを再利用できない大きな割り当てに応じて、メモリをより積極的にオペレーティングシステムに戻します。Goランタイムのタイマーとデッドラインコードはより高速で、より多くのCPUでより良くスケールします。特に、ネットワーク接続のデッドラインを操作するパフォーマンスが向上します。Linuxでは、ランタイムは現在、未使用のメモリを解放するためにMADV_FREE
を使用します。これはより効率的ですが、報告されるRSSが高くなる可能性があります。カーネルは必要に応じて未使用のデータを再取得します。Go 1.11の動作(MADV_DONTNEED
)に戻すには、環境変数GODEBUG=madvdontneed=1
を設定します。GODEBUG
環境変数にcpu.extension=off
を追加すると、標準ライブラリとランタイムでのオプションのCPU命令セット拡張の使用が無効になります。これはまだWindowsではサポートされていません。Go 1.12は、大きなヒープ割り当ての過剰計算を修正することでメモリプロファイルの精度を向上させます。トレースバック、runtime.Caller
、およびruntime.Callers
はもはやコンパイラ生成の初期化関数を含みません。グローバル変数の初期化中にトレースバックを行うと、現在はPKG.init.ializers
という名前の関数が表示されます。
標準ライブラリ
TLS 1.3
Go 1.12は、RFC 8446
で指定されたように、crypto/tls
パッケージでTLS 1.3のオプトインサポートを追加しました。これは、環境変数GODEBUG
に値tls13=1
を追加することで有効にできます。Go 1.13ではデフォルトで有効になります。TLS 1.3をネゴシエートするには、明示的なMaxVersion
をConfig
に設定せず、環境変数GODEBUG=tls13=1
を設定してプログラムを実行してください。TLS 1.2のすべての機能は、ConnectionState
のTLSUnique
と再ネゴシエーションを除いて、TLS 1.3で利用可能であり、同等またはそれ以上のセキュリティとパフォーマンスを提供します。TLS 1.3は以前のバージョンと後方互換性がありますが、特定のレガシーシステムでは正しく動作しない可能性があることに注意してください。安全でないほど小さいRSA証明書キー(512ビットキーを含む)は、TLS 1.3では機能しません。TLS 1.3の暗号スイートは構成可能ではありません。サポートされているすべての暗号スイートは安全であり、PreferServerCipherSuites
がConfig
に設定されている場合、優先順位は利用可能なハードウェアに基づいています。早期データ(「0-RTTモード」とも呼ばれる)は、クライアントまたはサーバーとして現在サポートされていません。さらに、Go 1.12サーバーは、クライアントが予期しない早期データを送信した場合にそれをスキップすることをサポートしていません。TLS 1.3の0-RTTモードは、クライアントがどのサーバーが0-RTTをサポートしているかに関する状態を保持することを伴うため、Go 1.12サーバーは他のサーバーが0-RTTをサポートするロードバランシングプールの一部になることはできません。0-RTTをサポートするサーバーからGo 1.12サーバーにドメインを切り替える場合、発行されたセッションチケットの有効期間中は0-RTTを無効にする必要があります。TLS 1.3では、クライアントがハンドシェイクで最後に話すため、サーバーでエラーが発生すると、クライアントの最初のRead
で返され、Handshake
では返されません。たとえば、サーバーがクライアント証明書を拒否した場合が該当します。同様に、セッションチケットは現在ポストハンドシェイクメッセージであるため、クライアントは最初のRead
でのみ受信します。
ライブラリの小さな変更
いつものように、Go 1の互換性の約束 を念頭に置いて、ライブラリにさまざまな小さな変更と更新が行われています。
bufio
Reader
のUnreadRune
およびUnreadByte
メソッドは、Peek
の後に呼び出された場合にエラーを返すようになりました。
bytes
新しい関数ReplaceAll は、値のすべての非重複インスタンスを別の値に置き換えたバイトスライスのコピーを返します。ゼロ値のReader へのポインタは、現在NewReader (nil)と機能的に同等です。Go 1.12以前では、前者はすべてのケースで後者の代わりとして使用することはできませんでした。
crypto/rand
Reader.Read
がカーネルからエントロピーを読み取るのを60秒以上待ってブロックされると、標準エラーに警告が表示されます。FreeBSDでは、Reader
は利用可能な場合はgetrandom
システムコールを使用し、そうでない場合は/dev/urandom
を使用します。
crypto/rc4
このリリースでは、アセンブリ実装が削除され、純粋なGoバージョンのみが残されています。Goコンパイラは、正確なCPUに応じて、わずかに優れたコードまたはわずかに劣るコードを生成します。RC4は安全ではなく、レガシーシステムとの互換性のためにのみ使用されるべきです。
crypto/tls
クライアントがTLSのように見えない初期メッセージを送信した場合、サーバーはもはやアラートで応答せず、基になるnet.Conn
を新しいフィールドConn
で公開します。RecordHeaderError
の。
database/sql
クエリカーソルは、*Rows 値をRow.Scan メソッドに渡すことで取得できるようになりました。
expvar
新しいDelete メソッドにより、Map からキー/値ペアを削除できます。
fmt
マップは現在、テストを容易にするためにキーソート順で印刷されます。順序付けのルールは次のとおりです:
- 該当する場合、
nil
は低く比較されます int
、float
、およびstring
は<
で順序付けされますNaN
は非NaN
のfloat
よりも小さく比較されますbool
はfalse
がtrue
の前に比較されますComplex
は実部、次に虚部で比較されます- ポインタはマシンアドレスで比較されます
- チャネル値はマシンアドレスで比較されます
- 構造体は各フィールドを順番に比較します
- 配列は各要素を順番に比較します
- インターフェース値は最初に具体的な型を記述する
reflect.Type
で比較され、次に前述のルールに従って具体的な値で比較されます。
マップを印刷する際、NaN
のような非反射的なキー値は以前は<nil>
として表示されていました。このリリースからは、正しい値が印刷されます。
go/doc
cmd/doc
のいくつかの未解決の問題に対処するために、このパッケージには新しいMode
ビットPreserveAST
が追加され、ASTデータがクリアされるかどうかを制御します。
go/token
File
型には新しいLineStart
フィールドが追加され、指定された行の開始位置を返します。これは、アセンブリなどの非Goファイルを時折処理するプログラムで特に便利ですが、ファイル位置を識別するためにtoken.Pos
メカニズムを使用したい場合に役立ちます。
image
RegisterFormat 関数は現在、同時使用に安全です。
image/png
16色未満のパレット画像は、より小さな出力にエンコードされるようになりました。
io
新しいStringWriter インターフェースは、WriteString 関数をラップします。
math
関数Sin 、Cos 、Tan 、およびSincos は、巨大な引数に対してPayne-Hanek範囲縮小を適用するようになりました。これにより、より正確な回答が得られますが、以前のリリースの結果とビット単位で同一ではありません。
math/bits
新しい拡張精度操作Add
、Sub
、Mul
、およびDiv
がuint
、uint32
、およびuint64
バージョンで利用可能です。
net
Dialer.DualStack 設定は現在無視され、非推奨とされています。RFC 6555 Fast Fallback(「Happy Eyeballs」)は現在デフォルトで有効になっています。無効にするには、Dialer.FallbackDelay を負の値に設定します。同様に、Dialer.KeepAlive がゼロの場合、TCPキープアライブは現在デフォルトで有効になっています。無効にするには、負の値に設定します。Linuxでは、UnixConn からTCPConn へのコピー時にspliceシステムコール が使用されるようになりました。
net/http
HTTPサーバーは現在、HTTPSサーバーへの誤ったHTTPリクエストをプレーンテキストの「400 Bad Request」応答で拒否します。新しいClient.CloseIdleConnections
メソッドは、クライアントの基になるトランスポートのCloseIdleConnections
を呼び出します(存在する場合)。Transport
は、HTTPトレーラーを宣言しているがチャンクエンコーディングを使用していないHTTP応答をもはや拒否しません。代わりに、宣言されたトレーラーは無視されます。Transport
は、HTTP/2サーバーから広告されたMAX_CONCURRENT_STREAMS
値をGo 1.10およびGo 1.11の間のように厳密に扱わなくなりました。デフォルトの動作は現在、Go 1.9のように戻っています:サーバーへの各接続は最大MAX_CONCURRENT_STREAMS
リクエストをアクティブにでき、その後必要に応じて新しいTCP接続が作成されます。Go 1.10およびGo 1.11では、http2
パッケージは新しい接続を作成する代わりにリクエストが終了するのを待ってブロックしていました。より厳しい動作を取り戻すには、golang.org/x/net/http2
パッケージを直接インポートし、Transport.StrictMaxConcurrentStreams
をtrue
に設定します。
net/url
Parse 、ParseRequestURI 、およびURL.Parse は、NULL、タブ、および改行を含むASCII制御文字を含むURLに対してエラーを返すようになりました。
net/http/httputil
ReverseProxy は現在、自動的にWebSocketリクエストをプロキシします。
os
新しいProcessState.ExitCode
メソッドは、プロセスの終了コードを返します。ModeCharDevice
がModeType
ビットマスクに追加され、ModeDevice | ModeCharDevice
がModeType
でFileMode
をマスクしたときに回復できるようになりました。新しい関数UserHomeDir
は、現在のユーザーのホームディレクトリを返します。RemoveAll
は現在、ほとんどのUnixシステムで4096文字を超えるパスをサポートしています。File.Sync
は現在、macOSでF_FULLFSYNC
を使用して、ファイルの内容を永続的なストレージに正しくフラッシュします。これにより、以前のリリースよりもメソッドの実行が遅くなる可能性があります。File
は現在、基になるファイルディスクリプタでシステム固有の操作を呼び出すために使用できるsyscall.RawConn
インターフェース値を返すSyscallConn
メソッドをサポートしています。
path/filepath
IsAbs
関数は現在、Windowsで予約されたファイル名(例:NUL
)が渡された場合にtrue
を返します。予約名のリスト。
reflect
新しいMapIter
型は、マップを範囲指定して反復するためのイテレータです。この型は、Value
型の新しいMapRange
メソッドを通じて公開されます。これは、イテレータを進めるためのNext
と、各エントリにアクセスするためのKey
/Value
を使用して、範囲ステートメントと同じ反復セマンティクスに従います。
regexp
Copy は、ロック競合を回避するために必要ではなくなったため、部分的な非推奨コメントが付けられました。Copy は、異なるLongest 設定を持つ2つのコピーを作成するために使用する場合には、依然として適切です。
runtime/debug
新しいBuildInfo 型は、実行中のバイナリから読み取られたビルド情報を公開します。これは、モジュールサポートでビルドされたバイナリでのみ利用可能です。これには、メインパッケージパス、メインモジュール情報、およびモジュール依存関係が含まれます。この型は、BuildInfo のReadBuildInfo 関数を通じて提供されます。
strings
新しい関数ReplaceAll は、値のすべての非重複インスタンスを別の値に置き換えた文字列のコピーを返します。ゼロ値のReader へのポインタは、現在NewReader (nil)と機能的に同等です。Go 1.12以前では、前者はすべてのケースで後者の代わりとして使用することはできませんでした。新しいBuilder.Cap メソッドは、ビルダーの基になるバイトスライスの容量を返します。文字マッピング関数Map 、Title 、ToLower 、ToLowerSpecial 、ToTitle 、ToTitleSpecial 、ToUpper 、およびToUpperSpecial は、常に有効なUTF-8を返すことを保証します。以前のリリースでは、入力が無効なUTF-8であっても、文字の置換が必要ない場合、これらのルーチンは誤って無効なUTF-8を変更せずに返していました。
syscall
FreeBSD 12では64ビットのinodeがサポートされるようになりました。一部の型がそれに応じて調整されました。Unixソケット(AF_UNIX )アドレスファミリは、互換性のあるWindowsバージョンでサポートされるようになりました。新しい関数Syscall18 がWindows用に導入され、最大18個の引数を持つ呼び出しが可能になりました。
syscall/js
Callback
型とNewCallback
関数は名前が変更されました。現在はそれぞれFunc
とFuncOf
と呼ばれています。これは破壊的な変更ですが、WebAssemblyのサポートはまだ実験的であり、Go 1の互換性の約束
の対象ではありません。古い名前を使用しているコードは更新する必要があります。新しいWrapper
インターフェースを実装する型がある場合、ValueOf
はその型のJavaScript値を返すためにそれを使用します。ゼロのValue
の意味が変更されました。現在はJavaScriptの未定義値を表しており、数値のゼロではありません。これは破壊的な変更ですが、WebAssemblyのサポートはまだ実験的であり、Go 1の互換性の約束
の対象ではありません。ゼロのValue
が数値のゼロを意味することに依存しているコードは更新する必要があります。新しいValue.Truthy
メソッドは、指定された値のJavaScriptの「truthiness」
を報告します。
testing
-benchtime
フラグは、値が「x」で終わる場合に、時間の代わりに明示的な反復回数を設定することをサポートするようになりました。たとえば、-benchtime=100x
はベンチマークを100回実行します。
text/template
テンプレートを実行する際、長いコンテキスト値はエラーで切り捨てられなくなりました。
|
|
は現在
|
|
ユーザー定義関数がテンプレートによって呼び出され、パニックが発生した場合、パニックは現在キャッチされ、Execute
またはExecuteTemplate
メソッドによってエラーとして返されます。
time
$GOROOT/lib/time/zoneinfo.zip
内のタイムゾーンデータベースがバージョン2018iに更新されました。このZIPファイルは、オペレーティングシステムによってタイムゾーンデータベースが提供されていない場合にのみ使用されることに注意してください。
unsafe
nil
のunsafe.Pointer
をuintptr
に変換し、算術演算で戻すことは無効です。(これはすでに無効でしたが、現在はコンパイラが誤動作する原因となります。)