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

JavaScriptを有効にしてください

前書き

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で利用できなくなりました。変数のシャドウイングをチェックするには、次のコマンドを使用します。

bash
1
2
go get -u golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
go vet -vettool=$(which shadow)

ツアー

Goツアーはメインのバイナリ配布に含まれなくなりました。ローカルでツアーを実行するには、go tool tourを実行する代わりに、手動でインストールしてください。

bash
1
2
go get -u golang.org/x/tour
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を使用してください。

モジュール

GO111MODULEonに設定されている場合、goコマンドは現在のディレクトリに相対的なインポートパスを解決する必要がないか、go.modファイルを明示的に編集する必要がない限り、モジュールディレクトリ外でのモジュール対応操作をサポートします。go getgo 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 の結果を直接反復する代わりに使用します。

go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 正しく動作しなくなった古いコード(インライン化された呼び出しフレームを見逃します)。
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
for _, pc := range pcs[:n] {
    f := runtime.FuncForPC(pc)
    if f != nil {
        fmt.Println(f.Name())
    }
}

// 正しく動作する新しいコード。
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
frames := runtime.CallersFrames(pcs[:n])
for {
    frame, more := frames.Next()
    fmt.Println(frame.Function)
    if !more {
        break
    }
}

メソッド式を実装するためにコンパイラによって生成されたラッパーは、もはや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をネゴシエートするには、明示的なMaxVersionConfig に設定せず、環境変数GODEBUG=tls13=1を設定してプログラムを実行してください。TLS 1.2のすべての機能は、ConnectionStateTLSUniqueと再ネゴシエーションを除いて、TLS 1.3で利用可能であり、同等またはそれ以上のセキュリティとパフォーマンスを提供します。TLS 1.3は以前のバージョンと後方互換性がありますが、特定のレガシーシステムでは正しく動作しない可能性があることに注意してください。安全でないほど小さいRSA証明書キー(512ビットキーを含む)は、TLS 1.3では機能しません。TLS 1.3の暗号スイートは構成可能ではありません。サポートされているすべての暗号スイートは安全であり、PreferServerCipherSuitesConfig に設定されている場合、優先順位は利用可能なハードウェアに基づいています。早期データ(「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

ReaderUnreadRune および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は低く比較されます
  • intfloat、およびstring<で順序付けされます
  • NaNは非NaNfloatよりも小さく比較されます
  • boolfalsetrueの前に比較されます
  • 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

関数SinCosTan 、およびSincos は、巨大な引数に対してPayne-Hanek範囲縮小を適用するようになりました。これにより、より正確な回答が得られますが、以前のリリースの結果とビット単位で同一ではありません。

math/bits

新しい拡張精度操作AddSubMul 、およびDivuintuint32、および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.StrictMaxConcurrentStreamstrueに設定します。

net/url

ParseParseRequestURI 、およびURL.Parse は、NULL、タブ、および改行を含むASCII制御文字を含むURLに対してエラーを返すようになりました。

net/http/httputil

ReverseProxy は現在、自動的にWebSocketリクエストをプロキシします。

os

新しいProcessState.ExitCode メソッドは、プロセスの終了コードを返します。ModeCharDeviceModeTypeビットマスクに追加され、ModeDevice | ModeCharDeviceModeTypeFileMode をマスクしたときに回復できるようになりました。新しい関数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 型は、実行中のバイナリから読み取られたビルド情報を公開します。これは、モジュールサポートでビルドされたバイナリでのみ利用可能です。これには、メインパッケージパス、メインモジュール情報、およびモジュール依存関係が含まれます。この型は、BuildInfoReadBuildInfo 関数を通じて提供されます。

strings

新しい関数ReplaceAll は、値のすべての非重複インスタンスを別の値に置き換えた文字列のコピーを返します。ゼロ値のReader へのポインタは、現在NewReader (nil)と機能的に同等です。Go 1.12以前では、前者はすべてのケースで後者の代わりとして使用することはできませんでした。新しいBuilder.Cap メソッドは、ビルダーの基になるバイトスライスの容量を返します。文字マッピング関数MapTitleToLowerToLowerSpecialToTitleToTitleSpecialToUpper 、およびToUpperSpecial は、常に有効なUTF-8を返すことを保証します。以前のリリースでは、入力が無効なUTF-8であっても、文字の置換が必要ない場合、これらのルーチンは誤って無効なUTF-8を変更せずに返していました。

syscall

FreeBSD 12では64ビットのinodeがサポートされるようになりました。一部の型がそれに応じて調整されました。Unixソケット(AF_UNIX )アドレスファミリは、互換性のあるWindowsバージョンでサポートされるようになりました。新しい関数Syscall18 がWindows用に導入され、最大18個の引数を持つ呼び出しが可能になりました。

syscall/js

Callback型とNewCallback関数は名前が変更されました。現在はそれぞれFuncFuncOf と呼ばれています。これは破壊的な変更ですが、WebAssemblyのサポートはまだ実験的であり、Go 1の互換性の約束 の対象ではありません。古い名前を使用しているコードは更新する必要があります。新しいWrapper インターフェースを実装する型がある場合、ValueOf はその型のJavaScript値を返すためにそれを使用します。ゼロのValue の意味が変更されました。現在はJavaScriptの未定義値を表しており、数値のゼロではありません。これは破壊的な変更ですが、WebAssemblyのサポートはまだ実験的であり、Go 1の互換性の約束 の対象ではありません。ゼロのValue が数値のゼロを意味することに依存しているコードは更新する必要があります。新しいValue.Truthy メソッドは、指定された値のJavaScriptの「truthiness」 を報告します。

testing

-benchtime フラグは、値が「x」で終わる場合に、時間の代わりに明示的な反復回数を設定することをサポートするようになりました。たとえば、-benchtime=100xはベンチマークを100回実行します。

text/template

テンプレートを実行する際、長いコンテキスト値はエラーで切り捨てられなくなりました。

bash
1
executing "tmpl" at <.very.deep.context.v...>: map has no entry for key "notpresent"

は現在

bash
1
executing "tmpl" at <.very.deep.context.value.notpresent>: map has no entry for key "notpresent"

ユーザー定義関数がテンプレートによって呼び出され、パニックが発生した場合、パニックは現在キャッチされ、ExecuteまたはExecuteTemplateメソッドによってエラーとして返されます。

time

$GOROOT/lib/time/zoneinfo.zip内のタイムゾーンデータベースがバージョン2018iに更新されました。このZIPファイルは、オペレーティングシステムによってタイムゾーンデータベースが提供されていない場合にのみ使用されることに注意してください。

unsafe

nilunsafe.Pointeruintptrに変換し、算術演算で戻すことは無効です。(これはすでに無効でしたが、現在はコンパイラが誤動作する原因となります。)


スポンサーリンク

共有

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