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

JavaScriptを有効にしてください

前書き

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

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

Go 1.10の紹介

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

このリリースでは、ビルド済みパッケージのキャッシュ を改善し、テスト結果のキャッシュ を追加し、テスト中に自動的にvetを実行 し、cgoを使用してGoとCの間で文字列値を直接渡すことを許可 します。新しい安全なコンパイラオプションのハードコードセット により、以前のリリースで正常にビルドされたコードで無効なフラグ エラーが発生する可能性があります。

言語の変更

言語仕様に大きな変更はありません。型指定されていない定数のシフトに関する隅のケースが明確化され、その結果、コンパイラが更新されて、sが符号なし整数である場合にx[1.0 << s]というインデックス式を許可するようになりました。go/typesパッケージはすでに対応していました。メソッド式の文法が更新され、任意の型式をレシーバーとして許可するように構文が緩和されました。これは、コンパイラがすでに実装していたものと一致します。たとえば、struct{io.Reader}.Readは、コンパイラがすでに受け入れていた有効でありながら珍しいメソッド式であり、言語文法によって許可されるようになりました。

ポート

このリリースには、新しくサポートされるオペレーティングシステムやプロセッサアーキテクチャはありません。ほとんどの作業は、既存のポートのサポートを強化することに焦点を当てています。特に、アセンブラの新しい命令 や、コンパイラによって生成されるコードの改善です。Go 1.9のリリースノートで発表されたように 、Go 1.10はFreeBSD 10.3以降を必要とし、FreeBSD 9.3のサポートは削除されました。Goは再びNetBSDで動作しますが、未リリースのNetBSD 8が必要です。修正されたのはGOARCH amd64と386のみです。armポートはまだ壊れています。32ビットMIPSシステムでは、新しい環境変数設定GOMIPS=hardfloat(デフォルト)およびGOMIPS=softfloatを使用して、浮動小数点計算にハードウェア命令を使用するかソフトウェアエミュレーションを使用するかを選択します。Go 1.10はOpenBSD 6.0で動作する最後のリリースです。Go 1.11はOpenBSD 6.2を必要とします。Go 1.10はOS X 10.8 Mountain LionまたはOS X 10.9 Mavericksで動作する最後のリリースです。Go 1.11はOS X 10.10 Yosemite以降を必要とします。Go 1.10はWindows XPまたはWindows Vistaで動作する最後のリリースです。Go 1.11はWindows 7以降を必要とします。

ツール

デフォルトのGOROOT & GOTMPDIR

環境変数$GOROOTが設定されていない場合、goツールは以前はツールチェーンのコンパイル中に設定されたデフォルトのGOROOTを使用していました。今では、そのデフォルトに戻る前に、goツールは自身の実行可能パスからGOROOTを推測しようとします。これにより、バイナリ配布をファイルシステム内の任意の場所に展開し、GOROOTを明示的に設定せずに使用できるようになります。デフォルトでは、goツールは一時ファイルとディレクトリをシステムの一時ディレクトリ(たとえば、Unixの$TMPDIR)に作成します。新しい環境変数$GOTMPDIRが設定されている場合、goツールはそのディレクトリに一時ファイルとディレクトリを作成します。

ビルド & インストール

go buildコマンドは、ソースファイルの内容、指定されたビルドフラグ、およびコンパイル済みパッケージに保存されたメタデータに基づいて、古いパッケージを検出します。変更時刻はもはや参照されず、関連性がありません。ビルドフラグの変更など、何らかの理由で変更時刻が誤解を招く場合に再ビルドを強制するために-aを追加するという古いアドバイスはもはや必要ありません。ビルドは、パッケージを再ビルドする必要がある場合を常に検出します。(そうでない場合は、バグを報告してください。)go build -asmflags, -gcflags, -gccgoflags, -ldflagsオプションは、デフォルトでコマンドラインに直接リストされたパッケージにのみ適用されます。たとえば、go build -gcflags=-m mypkgは、mypkgをビルドするときにコンパイラに-mフラグを渡しますが、その依存関係には渡しません。新しい、より一般的な形式-asmflags=pattern=flags(および他のものも同様に)は、パターンに一致するパッケージにのみフラグを適用します。たとえば、go install -ldflags=cmd/gofmt=-X=main.version=1.2.3 cmd/...は、cmd/...に一致するすべてのコマンドをインストールしますが、cmd/gofmtのリンカーフラグにのみ-Xオプションを適用します。詳細については、go help build を参照してください。

go buildコマンドは、最近ビルドされたパッケージのキャッシュを維持します。これは、$GOROOT/pkgまたは$GOPATH/pkgにインストールされたパッケージとは別です。キャッシュの効果は、パッケージを明示的にインストールしないビルドや、ソースコードの異なるコピー間を切り替えるとき(たとえば、バージョン管理システムで異なるブランチ間を切り替えるとき)にビルドを高速化することです。速度のために-iフラグを追加するという古いアドバイス(たとえば、go build -igo test -i)はもはや必要ありません。ビルドは-iなしでも同じ速さで実行されます。詳細については、go help cache を参照してください。

go installコマンドは、コマンドラインに直接リストされたパッケージとコマンドのみをインストールします。たとえば、go install cmd/gofmtgofmtプログラムをインストールしますが、それが依存するパッケージはインストールしません。新しいビルドキャッシュにより、依存関係がインストールされているかのように将来のコマンドが高速に実行されます。依存関係のインストールを強制するには、新しいgo install -iフラグを使用します。依存パッケージのインストールは一般的に必要ではなく、インストールされたパッケージの概念自体が将来のリリースで消える可能性があります。これらの改善をサポートするために、go buildの実装の多くの詳細が変更されました。これらの変更によって暗示される新しい要件の1つは、バイナリのみのパッケージが、そのインポートをバイナリのみのパッケージを使用してプログラムをリンクするときに利用できるようにするために、スタブソースコードに正確なインポートブロックを宣言する必要があることです。詳細については、go help filetype を参照してください。

テスト

go testコマンドは、テスト結果をキャッシュします。テスト実行ファイルとコマンドラインが以前の実行と一致し、その実行で参照されたファイルと環境変数が変更されていない場合、go testは以前のテスト出力を印刷し、経過時間を文字列「(cached)」に置き換えます。テストキャッシュは、成功したテスト結果にのみ適用されます。明示的なパッケージリストを持つgo testコマンドにのみ適用され、-cpu, -list, -parallel, -run, -short, -vテストフラグのサブセットを使用するコマンドラインにのみ適用されます。テストキャッシュをバイパスする慣用的な方法は、-count=1を使用することです。

go testコマンドは、テストされているパッケージに対して自動的にgo vetを実行し、テストを実行する前に重大な問題を特定します。このような問題はビルドエラーとして扱われ、テストの実行を妨げます。この自動チェックのために利用可能なgo vetチェックのうち、高信頼のサブセットのみが有効にされています。go vetの実行を無効にするには、go test -vet=offを使用します。

go test -coverpkgフラグは、引数を各テストの依存関係に対して一致するパターンのカンマ区切りリストとして解釈し、新たにパッケージをロードするリストとしてではありません。たとえば、go test -coverpkg=allは、テストパッケージとそのすべての依存関係に対してカバレッジを有効にしてテストを実行する意味のある方法です。また、go test -coverprofileオプションは、複数のテストを実行する際にサポートされるようになりました。タイムアウトによる失敗の場合、テストは終了する前にプロファイルを書き込む可能性が高くなりました。

go testコマンドは、特定のテストバイナリ実行からの標準出力と標準エラーを常にマージし、両方をgo testの標準出力に書き込みます。過去のリリースでは、go testはこのマージをほとんどの場合に適用していました。

go test -v出力には、並列テスト が一時停止および再開する際のPAUSEおよびCONTステータス更新行が含まれるようになりました。

新しいgo test -failfastフラグは、テストが失敗した後に追加のテストを実行しないようにします。失敗したテストと並行して実行されているテストは完了することが許可されていることに注意してください。

最後に、新しいgo test -jsonフラグは、テスト出力を新しいコマンドgo tool test2jsonを通じてフィルタリングし、テスト実行の機械可読なJSON形式の説明を生成します。これにより、IDEやその他のツールでテスト実行のリッチなプレゼンテーションを作成できます。これらの変更の詳細については、go help test およびtest2jsonドキュメント を参照してください。

Cgo

#cgo CFLAGSなどを使用してcgoによって指定されたオプションは、許可されたオプションのリストと照合されるようになりました。これにより、ダウンロードされたパッケージが-fpluginのようなコンパイラオプションを使用して、ビルドされているマシンで任意のコードを実行するセキュリティホールが閉じられます。これにより、#cgo CFLAGSで無効なフラグのようなビルドエラーが発生する可能性があります。このエラーの背景と対処方法については、https://golang.org/s/invalidflag を参照してください。

cgoは、typedef X YのようなCのtypedefをGoの型エイリアスを使用して実装するようになり、GoコードがC.XC.Yを互換的に使用できるようになりました。また、niladic関数のようなマクロの使用もサポートされるようになりました。また、cgoでエクスポートされた関数の型シグネチャでGo構造体やGo配列がサポートされていないことを明確にするために、ドキュメントが更新されました。

cgoは、CからGoの文字列値に直接アクセスすることをサポートするようになりました。Cのプレアンブル内の関数は、引数としてGo文字列を受け取るために型_GoString_を使用できます。Cコードは、文字列の内容に直接アクセスするために_GoStringLenおよび_GoStringPtrを呼び出すことができます。型_GoString_の値は、Go型stringの引数を取るエクスポートされたGo関数への呼び出しで渡すことができます。

ツールチェーンのブートストラップ中に、環境変数CCおよびCC_FOR_TARGETは、それぞれホストおよびターゲットビルドに使用されるデフォルトのCコンパイラを指定します。ただし、ツールチェーンが複数のターゲットで使用される場合、各ターゲットに異なるCコンパイラを指定する必要があるかもしれません(たとえば、darwin/arm64linux/ppc64leで異なるコンパイラを使用する場合)。新しい環境変数セットCC_FOR_goos_goarchを使用すると、各ターゲットに対して異なるデフォルトのCコンパイラを指定できます。これらの変数は、ツールチェーンのブートストラップ中にのみ適用され、結果として得られるツールチェーンで使用されるデフォルトを設定します。後のgo buildコマンドは、CC環境変数または組み込みのデフォルトを使用します。

cgoは、通常Goでポインタ型にマップされるいくつかのC型を、代わりにuintptrに変換するようになりました。これらの型には、DarwinのCoreFoundationフレームワークのCFTypeRef階層や、JavaのJNIインターフェースのjobject階層が含まれます。これらの型は、Go側でuintptrでなければならないため、Goのガベージコレクタを混乱させる可能性があります。これらは、実際にはポインタではなく、ポインタサイズの整数にエンコードされたデータ構造であることがあります。Goメモリへのポインタは、これらのuintptr値に格納してはなりません。この変更のため、影響を受ける型の値は、定数nilではなく定数0でゼロ初期化する必要があります。Go 1.10は、その書き換えを支援するためのgofixモジュールを提供します:
go tool fix -r cftype
go tool fix -r jni

詳細については、cgoドキュメント を参照してください。

Doc

go docツールは、単一のTまたは*Tの結果を返す関数の既存の動作に似て、Tまたは*Tのスライスを返す関数を型Tの表示に追加するようになりました。たとえば:

go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ go doc mail.Address
package mail // import "net/mail"

type Address struct {
    Name    string
    Address string
}
    Address represents a single mail address.

func ParseAddress(address string) (*Address, error)
func ParseAddressList(list string) ([]*Address, error)
func (a *Address) String() string
$

以前は、ParseAddressListはパッケージの概要(go doc mail)にのみ表示されていました。

Fix

go fixツールは、“golang.org/x/net/context"のインポートを"context"に置き換えるようになりました。(前者のフォワーディングエイリアスにより、Go 1.9以降を使用する場合、後者と完全に同等になります。)

Get

go getコマンドは、Fossilソースコードリポジトリをサポートするようになりました。

Pprof

runtime/pprofパッケージによって生成されるブロッキングおよびミューテックスプロファイルには、シンボル情報が含まれるようになり、プロファイルを生成したバイナリなしでgo tool pprofで表示できるようになりました。(他のすべてのプロファイルタイプは、Go 1.9でシンボル情報を含むように変更されました。)go tool pprof プロファイルビジュアライザーは、github.com/google/pprof からの更新されたWebインターフェースを含む、gitバージョン9e20b5b(2017-11-08)に更新されました。

Vet

go vet コマンドは、cgoまたはベンダーインポートを使用するパッケージでも、パッケージをチェックする際に完全で最新の型情報に常にアクセスできるようになりました。その結果、レポートはより正確になるはずです。注意すべきは、go vetのみがこの情報にアクセスできることであり、より低レベルのgo tool vetはアクセスできず、vet自体を操作する場合を除いて避けるべきです。(Go 1.9以降、go vetgo tool vetと同じフラグにアクセスできます。)

診断

このリリースには、新しい利用可能なGoプログラム診断ツールの概要 が含まれています。

Gofmt

Goソースコードのデフォルトのフォーマットの2つの小さな詳細が変更されました。まず、以前はx[i+1 : j:k]のようにフォーマットされていた複雑な3インデックススライス式が、より一貫したスペースでフォーマットされるようになりました:x[i+1 : j : k]。次に、単一行で書かれた単一メソッドインターフェースリテラルは、タイプアサーションで時々使用されるもので、もはや複数行に分割されません。これらの種類のgofmtのマイナーな更新は、時折発生することが予想されます。一般に、特定のバージョンのgofmtの出力と一致することを確認するシステムの構築は推奨されません。たとえば、リポジトリにすでにチェックインされているコードが「適切にフォーマットされていない」場合に失敗する継続的インテグレーションテストは、本質的に脆弱であり、推奨されません。複数のプログラムがソースファイルをフォーマットするために使用するgofmtのバージョンに同意する必要がある場合は、同じgofmtバイナリを呼び出すように手配することをお勧めします。たとえば、Goオープンソースリポジトリでは、GitのプレコミットフックはGoで書かれており、go/formatを直接インポートすることができますが、代わりに現在のパスにあるgofmtバイナリを呼び出すため、gofmtが変更されるたびにプレコミットフックを再コンパイルする必要はありません。

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

コンパイラには、サポートされているアーキテクチャ全体にわたって生成されたコードのパフォーマンスを向上させる多くの改善が含まれています。バイナリに記録されたDWARFデバッグ情報は、いくつかの方法で改善されました:定数値が記録されるようになり、行番号情報がより正確になり、プログラムのソースレベルでのステップ実行が改善され、各パッケージが独自のDWARFコンパイルユニットとして提示されるようになりました。さまざまなビルドモード がより多くのシステムに移植されました。具体的には、c-sharedlinux/ppc64le, windows/386, windows/amd64で動作するようになり、piedarwin/amd64で動作し、すべてのシステムで外部リンクの使用を強制し、pluginlinux/ppc64ledarwin/amd64で動作するようになりました。linux/ppc64leポートは、標準ライブラリによる使用を含む、cgoを使用するプログラムで外部リンクの使用を必要とするようになりました。

アセンブラ

ARM 32ビットポートでは、アセンブラが次の命令をサポートするようになりました:
BFC,
BFI,
BFX,
BFXU,
FMULAD,
FMULAF,
FMULSD,
FMULSF,
FNMULAD,
FNMULAF,
FNMULSD,
FNMULSF,
MULAD,
MULAF,
MULSD,
MULSF,
NMULAD,
NMULAF,
NMULD,
NMULF,
NMULSD,
NMULSF,
XTAB,
XTABU,
XTAH,
XTAHU
ARM 64ビットポートでは、アセンブラが次の命令をサポートするようになりました:
VADD,
VADDP,
VADDV,
VAND,
VCMEQ,
VDUP,
VEOR,
VLD1,
VMOV,
VMOVI,
VMOVS,
VORR,
VREV32,
VST1
PowerPC 64ビットポートでは、アセンブラが次のPOWER9命令をサポートするようになりました:
ADDEX,
CMPEQB,
COPY,
DARN,
LDMX,
MADDHD,
MADDHDU,
MADDLD,
MFVSRLD,
MTVSRDD,
MTVSRWS,
PASTECC,
VCMPNEZB,
VCMPNEZBCC,
VMSUMUDM
S390Xポートでは、アセンブラが次の命令をサポートするようになりました:
TMHH,
TMHL,
TMLH,
TMLL
X86 64ビットポートでは、アセンブラが359の新しい命令をサポートするようになり、AVX, AVX2, BMI, BMI2, F16C, FMA3, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2拡張セットが完全にサポートされます。アセンブラはまた、MOVL $0, AXをXORL命令として実装しなくなり、条件フラグを予期せずクリアするのを避けます。

Gccgo

Goの半期リリーススケジュールとGCCの年次リリーススケジュールの整合性により、GCCリリース7にはgccgoのGo 1.8.3バージョンが含まれています。次のリリースであるGCC 8には、gccgoのGo 1.10バージョンが含まれることを期待しています。

ランタイム

LockOSThread およびUnlockOSThread へのネストされた呼び出しの動作が変更されました。これらの関数は、ゴルーチンが特定のオペレーティングシステムスレッドにロックされ、そのゴルーチンがそのスレッドでのみ実行され、そのスレッドがそのゴルーチンのみを実行するように制御します。以前は、LockOSThreadを連続して複数回呼び出すことは、1回呼び出すことと同等であり、単一のUnlockOSThreadは常にスレッドをアンロックしていました。今では、呼び出しがネストされます:LockOSThreadが複数回呼び出された場合、スレッドをアンロックするためには同じ回数だけUnlockOSThreadを呼び出す必要があります。これらの呼び出しをネストしないように注意していた既存のコードは正しいままです。これらの呼び出しがネストされると誤って仮定していた既存のコードは正しくなります。公開されているGoソースコードでのこれらの関数の使用のほとんどは、2番目のカテゴリに該当します。
LockOSThreadおよびUnlockOSThreadの一般的な使用法の1つは、Goコードがスレッドローカルの状態(たとえば、LinuxまたはPlan 9の名前空間)を確実に変更できるようにすることです。ランタイムは、ロックされたスレッドを再利用や新しいスレッドの作成に不適切なものとして扱うようになりました。

スタックトレースには、ラッパー自体でフォールトやパニックが発生しない限り、暗黙のラッパー関数(以前はマークされていた)が含まれなくなりました。その結果、Caller などの関数に渡されるスキップカウントは、最適化の決定や実装の詳細に依存するのではなく、常に書かれたコードの構造に一致する必要があります。ガベージコレクタは、割り当ての遅延への影響を減らすように変更されました。

ガベージコレクタは、実行中に全体のCPUのより小さな割合を使用しますが、より多くの時間実行される可能性があります。ガベージコレクタによって消費される総CPUは大幅に変わっていません。

GOROOT 関数は、($GOROOT環境変数が設定されていない場合)呼び出しプログラムがコンパイルされた時点で有効なGOROOTまたはGOROOT_FINALをデフォルトとするようになりました。以前は、呼び出しプログラムをコンパイルしたツールチェーンがコンパイルされた時点で有効なGOROOTまたはGOROOT_FINALを使用していました。GOMAXPROCS 設定の制限はもはやありません。(Go 1.9では、制限は1024でした。)

パフォーマンス

いつものように、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な声明を行うことは困難です。ほとんどのプログラムは、ガベージコレクタの速度向上、生成されたコードの改善、およびコアライブラリの最適化により、少し速く実行されるはずです。

ガベージコレクタ

ガベージコレクタがアクティブなとき、多くのアプリケーションは、割り当ての遅延と全体的なパフォーマンスのオーバーヘッドが大幅に低下するはずです。

標準ライブラリ

標準ライブラリへの変更はすべて小さなものです。bytes およびnet/url の変更は、既存のプログラムの更新を必要とする可能性が最も高いです。

ライブラリの小さな変更

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

archive/tar

一般的に、特殊なヘッダーフォーマットの処理が大幅に改善および拡張されました。FileInfoHeader は、常にそのos.FileInfo 引数(具体的には、FileInfoのSysメソッドによって返されるシステム依存の情報)からUnix UIDおよびGID番号を記録していましたが、今ではそれらのIDに対応するユーザーおよびグループ名、デバイスファイルのメジャーおよびマイナーデバイス番号も記録します。

Format の新しいHeader.Format フィールドは、Writer が使用するtarヘッダーフォーマットを制御します。デフォルトは、以前と同様に、ヘッダーが必要とするフィールドをエンコードできる最も広くサポートされているヘッダータイプ(可能であればUSTAR、そうでなければPAX、そうでなければGNU)を選択します。

Reader は、読み取った各ヘッダーに対してHeader.Formatを設定します。ReaderとWriterは、既存のXattrsフィールドの一般化である新しいHeader.PAXRecords フィールドを使用して、任意のPAXレコードをサポートするようになりました。ReaderはもはやGNUヘッダーのファイル名またはリンク名が有効なUTF-8であることを主張しません。PAXまたはGNU形式のヘッダーを書き込む際、WriterはHeader.AccessTimeおよびHeader.ChangeTimeフィールド(設定されている場合)を含めるようになりました。PAX形式のヘッダーを書き込む際、時間にはサブ秒精度が含まれます。

archive/zip

Go 1.10は、ZIPアーカイブ内の時間と文字セットエンコーディングのより完全なサポートを追加しました。元のZIP形式は、年、月、日、時、分、秒を2つの16ビット値のフィールドにエンコードする標準的なMS-DOSエンコーディングを使用していました。このエンコーディングは、タイムゾーンや奇数秒を表現できないため、より豊かなエンコーディングを可能にするために複数の拡張が導入されました。

Go 1.10では、Reader およびWriter は、時間を32ビットのUnix「エポックからの秒数」形式で別々にエンコードする広く理解されているInfo-Zip拡張をサポートするようになりました。

FileHeader の新しいModifiedフィールドは、MS-DOSエンコーディングを保持し続けるModifiedTimeおよびModifiedDateフィールドを廃止します。

ReaderとWriterは、タイムゾーンに依存しないUnix時間を格納するZIPアーカイブが、MS-DOSフィールドにローカル時間も格納するという一般的な慣習を採用しているため、タイムゾーンオフセットを推測できます。互換性のために、ModTime およびSetModTime メソッドは、以前のリリースと同じように動作します。新しいコードはModifiedを直接使用するべきです。
ZIPアーカイブ内の各ファイルのヘッダーには、名前およびコメントフィールドがUTF-8としてエンコードされているか、システム固有のデフォルトエンコーディングとしてエンコードされているかを示すフラグビットがあります。Go 1.8およびそれ以前では、WriterはUTF-8ビットを設定しませんでした。Go 1.9では、Writerはほとんど常にUTF-8ビットを設定するように変更されました。これにより、Shift-JISファイル名を含むZIPアーカイブの作成が壊れました。Go 1.10では、Writerは、名前とコメントフィールドの両方が有効なUTF-8であり、少なくとも1つが非ASCIIである場合にのみUTF-8ビットを設定するようになりました。非ASCIIエンコーディングが有効なUTF-8のように見えることは非常にまれであるため、新しいヒューリスティックはほとんどの場合正しいはずです。FileHeaderの新しいNonUTF8フィールドをtrueに設定すると、そのファイルに対するヒューリスティックが完全に無効になります。Writerはまた、Writerの新しいSetComment メソッドを呼び出すことによって、中央ディレクトリの終わりのレコードのコメントフィールドを設定することをサポートするようになりました。

bufio

新しいReader.Size およびWriter.Size メソッドは、ReaderまたはWriterの基礎となるバッファサイズを報告します。

bytes

FieldsFieldsFuncSplit 、およびSplitAfter 関数は、常に入力のサブスライスを返していました。Go 1.10では、返される各サブスライスの容量がその長さと等しくなるように変更され、1つに追加しても元の入力の隣接データを上書きできないようになりました。

crypto/cipher

NewOFB は、他のコンストラクタが常に持っていたように、誤った長さの初期化ベクトルが与えられた場合にパニックを引き起こすようになりました。(以前はnilのStream実装を返していました。)

crypto/tls

TLSサーバーは、TLS 1.2を使用する際にSHA-512署名のサポートを広告するようになりました。サーバーはすでに署名をサポートしていましたが、一部のクライアントは明示的に広告されない限りそれらを選択しませんでした。

crypto/x509

Certificate.Verify は、クライアントが問い合わせた1つの名前だけでなく、証明書に含まれるすべての名前に対して名前制約を強制するようになりました。同様に、拡張キー使用制限も一度にすべてチェックされるようになりました。その結果、証明書が検証された後は、証明書全体を信頼できるようになりました。追加の名前やキー使用ごとに証明書を再検証する必要はありません。解析された証明書は、URI名およびIP、メール、URI制約を新しいCertificate フィールドURIs, PermittedIPRanges, ExcludedIPRanges, PermittedEmailAddresses, ExcludedEmailAddresses, PermittedURIDomains, ExcludedURIDomainsを使用して報告するようになりました。これらのフィールドに無効な値を持つ証明書は拒否されるようになりました。新しいMarshalPKCS1PublicKey およびParsePKCS1PublicKey 関数は、RSA公開鍵をPKCS#1エンコード形式に変換および逆変換します。新しいMarshalPKCS8PrivateKey 関数は、秘密鍵をPKCS#8エンコード形式に変換します。(ParsePKCS8PrivateKey はGo 1から存在しています。)

crypto/x509/pkix

Name は、X.509識別名を標準のRFC 2253形式でフォーマットするString メソッドを実装するようになりました。

database/sql/driver

現在、driver.Rows.Next によって提供される宛先バッファを保持しているドライバは、その呼び出しの外で宛先配列に割り当てられたバッファに書き込まないようにする必要があります。ドライバは、driver.Rows を閉じる際に基礎となるバッファが変更されないように注意する必要があります。クライアントのためにsql.DB を構築したいドライバは、Connector インターフェースを実装し、新しいsql.OpenDB 関数を呼び出すことができ、すべての構成を文字列にエンコードしてsql.Open に渡す必要がなくなりました。構成文字列をsql.DBごとに一度だけ解析したい、または各sql.Connの基礎となるコンテキストにアクセスしたいドライバは、そのDriver 実装がDriverContext の新しいOpenConnectorメソッドを実装するようにすることができます。ExecerContext を実装するドライバは、もはやExecer を実装する必要はありません。同様に、QueryerContext を実装するドライバは、もはやQueryer を実装する必要はありません。以前は、コンテキストベースのインターフェースが実装されていても、非コンテキストベースのインターフェースも実装されていない限り無視されていました。キャッシュされたドライバ接続を連続して使用する異なるクライアントをよりよく分離するために、Conn が新しいSessionResetter インターフェースを実装する場合、database/sqlは新しいクライアントのためにConnを再利用する前にResetSessionを呼び出すようになりました。

debug/elf

このリリースでは、348の新しい再配置定数が追加され、再配置タイプR_386R_AARCH64R_ARMR_PPC64 、およびR_X86_64 に分割されています。

debug/macho

Go 1.10は、Section 構造体の新しいRelocsフィールドと新しいRelocRelocTypeARMRelocTypeARM64RelocTypeGeneric 、およびRelocTypeX86_64 タイプと関連する定数を使用して、Mach-Oセクションからの再配置の読み取りをサポートするようになりました。Go 1.10はまた、RpathCmd およびRpath タイプによって表されるLC_RPATHロードコマンドのサポートを追加し、ヘッダーに見られるさまざまなフラグビットのための新しい名前付き定数 を追加しました。

encoding/asn1

Marshal は、アスタリスクを含む文字列をPrintableStringではなくUTF8Stringとして正しくエンコードするようになりました。ただし、文字列がPrintableStringの使用を強制するタグを持つ構造体フィールドにある場合を除きます。Marshalはまた、アプリケーションディレクティブを含む構造体タグを尊重するようになりました。新しいMarshalWithParams 関数は、追加のパラメータがその関連する構造体フィールドタグであるかのように引数をマーシャリングします。Unmarshal は、explicitおよびtagディレクティブを使用する構造体フィールドタグを尊重するようになりました。MarshalとUnmarshalの両方が、新しい構造体フィールドタグnumericをサポートし、ASN.1 NumericStringを示します。

encoding/csv

Reader は、NUL、キャリッジリターン、改行、無効なルーン、Unicode置換文字、またはCommaとCommentを同じに設定するなどの無意味なCommaおよびComment設定の使用を許可しなくなりました。複数の入力行にまたがるCSVレコードの構文エラーの場合、ReaderはParseError の新しいStartLineフィールドでレコードが開始された行を報告するようになりました。

encoding/hex

新しい関数NewEncoder およびNewDecoder は、すでにencoding/base32 およびencoding/base64 に存在する同等の関数に類似して、16進数へのストリーミング変換を提供します。関数Decode およびDecodeString が不正な入力に遭遇した場合、エラーとともにすでに変換されたバイト数を返すようになりました。以前は、エラーがある場合は常に0を返していました。

encoding/json

Decoder は、新しいメソッドDisallowUnknownFields を追加し、未知のJSONフィールドを持つ入力をデコードエラーとして報告するようにします。(デフォルトの動作は、未知のフィールドを破棄することでした。)reflectバグの修正 の結果として、Unmarshal は、エクスポートされていない構造体型への埋め込みポインタ内のフィールドをデコードできなくなりました。これは、エクスポートされていない埋め込みポインタを新しいストレージを指すように初期化できないためです。この場合、Unmarshalはエラーを返すようになりました。

encoding/pem

Encode およびEncodeToMemory は、PEMデータとしてエンコードすることが不可能なブロックが提示された場合に部分的な出力を生成しなくなりました。

encoding/xml

新しい関数NewTokenDecoder は、NewDecoder に似ていますが、XML形式のバイトストリームではなくTokenReader から読み取るデコーダを作成します。これは、クライアントライブラリでXMLストリームトランスフォーマーを構築することを可能にすることを目的としています。

flag

デフォルトのUsage 関数は、出力の最初の行をCommandLine.Output()に印刷するようになり、os.Stderrを仮定しなくなりました。これにより、CommandLine.SetOutputを使用するクライアントのために使用メッセージが適切にリダイレクトされます。PrintDefaults は、フラグ使用文字列の改行後に適切なインデントを追加するようになり、複数行の使用文字列がきれいに表示されるようになりました。FlagSet は、新しいメソッドErrorHandlingName 、およびOutput を追加し、NewFlagSet に渡された設定とFlagSet.SetOutput を取得します。

go/doc

上記のdocの変更 をサポートするために、T*T**Tなどのスライスを返す関数は、TType のFuncsリストに報告されるようになり、Package のFuncsリストには報告されなくなりました。

go/importer

For 関数は、非nilのlookup引数を受け入れるようになりました。

go/printer

上記のgofmtセクション で説明したGoソースコードのデフォルトフォーマットの変更は、go/printer パッケージに実装されており、より高レベルのgo/format パッケージの出力にも影響します。

hash

Hash インターフェースの実装は、内部状態を保存および再作成できるようにするためにencoding.BinaryMarshaler およびencoding.BinaryUnmarshaler を実装することが奨励されており、標準ライブラリのすべての実装(hash/crc32crypto/sha256 など)はこれらのインターフェースを実装しています。

html/template

新しいSrcset コンテンツタイプは、imgタグのsrcset 属性内の値を適切に処理することを可能にします。

math/big

Int は、SetString およびText メソッドで、基数2から62への変換をサポートするようになりました。(以前は基数2から36のみを許可していました。)定数MaxBaseの値が更新されました。Int は、新しいCmpAbs メソッドを追加し、Cmp に似ていますが、引数の絶対値(符号ではなく)のみを比較します。Float は、新しいSqrt メソッドを追加し、平方根を計算します。

math/cmplx

AsinAsinhAtan 、およびSqrt の分岐カットおよびその他の境界ケースが、C99標準で使用される定義に一致するように修正されました。

math/rand

新しいShuffle 関数および対応するRand.Shuffle メソッドは、入力シーケンスをシャッフルします。

math

新しい関数Round およびRoundToEven は、引数を最も近い浮動小数点整数に丸めます。Roundは半整数をその大きい整数の隣接値(ゼロから離れる方向)に丸め、RoundToEvenは半整数をその偶数の整数の隣接値に丸めます。新しい関数Erfinv およびErfcinv は、逆誤差関数および逆補完誤差関数を計算します。

mime/multipart

Reader は、空のファイル名属性を持つパーツを受け入れるようになりました。

mime

ParseMediaType は、無効な属性値を破棄するようになりました。以前はそれらの値を空の文字列として返していました。

net

このパッケージのConn およびListener の実装は、Closeが返されたときに基礎となるファイルディスクリプタが閉じられたことを保証するようになりました。(以前のリリースでは、Closeが他のゴルーチンで保留中のI/Oを停止した場合、ファイルディスクリプタの閉鎖はCloseが返された直後にそれらのゴルーチンの1つで発生する可能性がありました。)TCPListener およびUnixListener は、基礎となるファイルディスクリプタにオプションを設定するためにsyscall.RawConn.Control を使用するためにsyscall.Conn を実装するようになりました。Pipe によって返されるConnの実装は、読み取りおよび書き込みの期限を設定することをサポートするようになりました。IPConn.ReadMsgIPIPConn.WriteMsgIPUDPConn.ReadMsgUDP 、およびUDPConn.WriteMsgUDP メソッドは、Windowsで実装されるようになりました。

net/http

クライアント側では、HTTPプロキシ(最も一般的にはProxyFromEnvironment によって設定される)がhttps:// URLとして指定できるようになり、クライアントがHTTPSを介してプロキシに接続してから標準のプロキシHTTPリクエストを発行します。(以前は、HTTPプロキシURLはhttp://またはsocks5://で始まる必要がありました。)サーバー側では、FileServer およびその単一ファイルの同等のServeFile は、HEADリクエストに対してIf-Rangeチェックを適用するようになりました。FileServerはまた、ディレクトリの読み取り失敗をServer のErrorLogに報告するようになりました。コンテンツ提供ハンドラはまた、ゼロ長のコンテンツを提供する際にContent-Typeヘッダーを省略するようになりました。ResponseWriter のWriteHeaderメソッドは、無効な(3桁でない)ステータスコードが渡された場合にパニックを引き起こすようになりました。サーバーは、ハンドラが出力を書き込まない場合に暗黙のContent-Typeを追加しなくなりました。Redirect は、HTTPレスポンスを書き込む前にContent-Typeヘッダーを設定するようになりました。

net/mail

ParseAddress およびParseAddressList は、さまざまな古いアドレス形式をサポートするようになりました。

net/smtp

Client は、新しいNoop メソッドを追加し、サーバーがまだ応答しているかどうかをテストします。また、Hello およびVerify メソッドへの入力でのSMTPインジェクションの可能性に対して防御するようになりました。

net/textproto

ReadMIMEHeader は、継続(インデントされた)ヘッダー行で始まるヘッダーを拒否するようになりました。以前は、インデントされた最初の行を持つヘッダーは、最初の行がインデントされていないかのように扱われていました。

net/url

ResolveReference は、ターゲットURLの複数の先頭スラッシュを保持するようになりました。以前は、複数の先頭スラッシュを1つのスラッシュに書き換えていましたが、これによりhttp.Client が特定のリダイレクトを誤ってフォローすることになりました。たとえば、このコードの出力が変更されました:

go
1
2
3
base, _ := url.Parse("http://host//path//to/page1")
target, _ := url.Parse("page2")
fmt.Println(base.ResolveReference(target))

pathの周りの二重スラッシュに注意してください。Go 1.9およびそれ以前では、解決されたURLはhttp://host/path//to/page2でした:pathの前の二重スラッシュは誤って1つのスラッシュに書き換えられ、pathの後の二重スラッシュは正しく保持されました。Go 1.10は、RFC 3986 で要求されるように、両方の二重スラッシュを保持し、http://host//path//to/page2に解決します。この変更により、誤って先頭に二重スラッシュを持つベースURLを構築し、ResolveReferenceがその間違いを修正することに依存している既存のバグのあるプログラムが壊れる可能性があります。たとえば、コードがhttp://host/のようなホストプレフィックスを/my/apiのようなパスに追加し、二重スラッシュを持つURLを生成する場合に発生する可能性があります:http://host//my/apiUserInfo のメソッドは、nilレシーバーをゼロUserInfoへのポインタと同等として扱うようになりました。以前はパニックを引き起こしていました。

os

File は、新しいメソッドSetDeadlineSetReadDeadline 、およびSetWriteDeadline を追加し、基礎となるファイルディスクリプタが非ブロッキングI/O操作をサポートする場合にI/O期限を設定できるようにします。これらのメソッドの定義は、net.Conn のものと一致します。I/Oメソッドが期限を逃したために失敗した場合、タイムアウトエラーを返します。新しいIsTimeout 関数は、エラーがタイムアウトを表しているかどうかを報告します。また、net.Connと一致するように、FileのClose メソッドは、Closeが返されたときに基礎となるファイルディスクリプタが閉じられたことを保証するようになりました。(以前のリリースでは、Closeが他のゴルーチンで保留中のI/Oを停止した場合、ファイルディスクリプタの閉鎖はCloseが返された直後にそれらのゴルーチンの1つで発生する可能性がありました。)BSD、macOS、およびSolarisシステムでは、Chtimes は、ファイルシステムがそれらを表現できる場合、ナノ秒精度でファイル時間を設定することをサポートするようになりました。

reflect

Copy 関数は、組み込みのcopy関数 と一致するように、文字列からバイト配列またはバイトスライスへのコピーを許可するようになりました。構造体では、エクスポートされていない構造体型への埋め込みポインタは、対応するStructField で空のPkgPathを持つと誤って報告されていました。その結果、それらのフィールドに対してValue.CanSet が誤ってtrueを返し、Value.Set が誤って成功していました。基礎となるメタデータが修正されました。それらのフィールドに対して、CanSetは正しくfalseを返し、Setは正しくパニックを引き起こします。これにより、以前はそのようなフィールドにアンマーシャルできたが、もはやできなくなったリフレクションベースのアンマーシャラに影響を与える可能性があります。たとえば、encoding/jsonのノート を参照してください。

runtime/pprof

上記で述べたように 、ブロッキングおよびミューテックスプロファイルには、生成したバイナリを必要とせずに表示できるようにシンボル情報が含まれるようになりました。

strconv

ParseUint は、ErrRangeエラーがある場合に、適切なサイズの最大の絶対値整数を返すようになりました。これはすでに文書化されていたことです。以前はErrRangeエラーで0を返していました。

strings

新しい型Builder は、文字列結果にテキストを蓄積するユースケースのためのbytes.Buffer の代替です。BuilderのAPIは、String メソッド中にデータの重複コピーを安全に回避できるようにするbytes.Bufferの制限されたサブセットです。

syscall

Windowsでは、新しいSysProcAttr フィールドTokenは、StartProcess (したがって、[os.StartProcess](


スポンサーリンク

共有

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