この記事は https://golang.org/doc/go1.15 を日本語訳したものです. 前のバージョンはこちら: Go 1.14 リリースノート 日本語訳. 次のバージョンはこちら: Go 1.16 リリースノート 日本語訳.
Go 1.15 の紹介
最新の Go リリース、バージョン 1.15 は、Go 1.14 から6か月後に届きます. その変更点のほとんどは、ツールチェーン、ランタイム、およびライブラリの実装になります. いつものように、このリリースは Go 1 の互換性の約束を守っています. 私たちは、ほとんどすべての Go プログラムが以前と同じようにコンパイルし実行し続けれると予想しています.
Go 1.15 には、リンカの大幅な改良、多 CPU コア数での小さなオブジェクトの割り当ての改善、X.509 CommonName の廃止が含まれています. GOPROXY
はエラーを返すプロキシのスキップをサポートし、新しい埋め込み tzdata パッケージが追加されました。
言語への変更
言語の変更はありません.
ポート
Darwin
Go 1.14 のリリースノートでアナウンスしたように、Go 1.15 は macOS 10.12 Sierra 以降を必要とし、以前のバージョンのサポートは終了となります.
Go 1.14 のリリースノートでアナウンスしたように、Go 1.15 は macOS、iOS、iPadOS, watchOS、tvOS 上の32ビットバイナリ(darwin/386
と darwin/arm
のポート)のサポートを終了します. Go は64ビットの darwin/amd64
と darwin/arm64
のサポートは継続します.
Windows
Go は -buildmode=pie
cmd/link フラグが指定されたときに Windows ASLR 実行ファイルを生成するようになりました, Windows では、Go コマンドはデフォルトで -buildmode=pie
を使用します.
-race
と -msan
フラグは、unsafe.Pointer
の使用をチェックする -d=checkptr
を常に有効とするようになりました. これは以前から Windows を除く全ての OS でそうでした.
Go で作られた DLL は、シグナル(ターミナルでの Ctrl-C など)を受け取ったときにプロセスを終了させないようになりました.
Android
Android 用のバイナリをリンクする際に、Go 1.15 は最近のバージョンの NDK で利用可能な lld
リンカを明示的に選択します. lld
リンカは一部のデバイスでのクラッシュを回避し、将来の NDK バージョンではデフォルトのNDK リンカになる予定です.
OpenBSD
Go 1.15 は GOARCH=arm
と GOARCH=arm64
での OpenBSD 6.7 のサポートを追加します. 以前のバージョンの Go では、すでに GOARCH=386
と GOARCH=amd64
での OpenBSD 6.7 をサポートしています.
RISC-V
Linux 上の 64 ビット RISC-V ポート(GOOS=linux
, GOARCH=riscv64
)の安定性と性能の向上に進展がありました. また、非同期のプリエンプションもサポートするようになりました.
386
Go 1.15 は x87 浮動小数点数のみを持つハードウェア(GO386=387
)をサポートする最後のリリースとなります. 今後のリリースでは 386 では少なくとも SSE2 をサポートすることが要求されるようになり、Go の GOARCH=386
の最小要件は Intel Pentium 4 (2000年リリース) または AMD Opteron/Athlon 64 (2003年リリース) に引き上げられます.
ツール
Go コマンド
GOPROXY
環境変数はエラーを返すプロキシのスキップをサポートしました. プロキシ URL はカンマ (,
) かパイプ文字 (|
) で区切ることができるようになりました. もしプロキシ URL がカンマに続いている場合、go
コマンドは 404 か 410 HTTP レスポンスの場合にのみリストの次のプロキシを試します. もしプロキシ URL がパイプ文字に続いている場合、go
コマンドはどんなエラーでもリストの次のプロキシを試します. GOPROXY
のデフォルト値は、エラーのときに direct
にフォールバックしない https://proxy.golang.org,direct
のままであることに注意してください.
go test
-timeout
フラグの変更がキャッシュされたテスト結果を無効化するようになりました. 長いタイムアウトで実行したテストの結果のキャッシュが、短いタイムアウトで go test
を再実行した時にパスとしてカウントされることはもう有りません.
フラグ解析
go test
と go vet
の様々なフラグ解析の問題が修正されました. 特に GOFLAGS
の中で指定されたフラグはより一貫性があるように扱われるようになり、-outputdir
フラグは (個々のテストの作業ディレクトリではなく) go
コマンドの作業ディレクトリと解釈されるようになりました.
モジュールキャッシュ
モジュールキャッシュの場所は GOMODCACHE
環境変数で設定できるようになりました. GOMODCACHE
のデフォルト値は、この変更が入る前からモジュールがキャッシュされていた場所である GOPATH[0]/pkg/mod
です.
外部プログラムがファイルシステムを同時にスキャンすることで発生する、モジュールキャッシュにアクセスする go
コマンドで "Access is denied" エラーが発生する Windows 向けのワークアラウンドが利用可能になりました(issue #36568を見てください). 1.14.2 及び 1.13.10 未満の Go バージョンが同じモジュールキャッシュで同時に実行される時に使用すると安全ではないため、このワークアラウンドはデフォルトでは有効となっていません. 環境変数に GODEBUG=modcacheunzipinplace=1
を明示的に設定することにより、有効にできます.
Vet
string(x) への新しい警告
vet ツールは,x
が rune
もしくは byte
以外の整数型を持つ string(x)
形式の変換について警告するようになりました. Go での経験から、この形式の変換の多くは、string(x)
が整数 x
の文字列表現に評価されると誤って想定していることが分かっています. 実際には、x
の値の UTF-8 エンコーディングを含む文字列として評価されます. 例えば、string(9786)
は文字列 "9786"
に評価されるのではなく、文字列 "\xe2\x98\xba"
もしくは "☺"
に評価されます。
string(x)
を正しく使用しているコードは、string(rune(x))
に書き換えることが可能です. あるいは、いくつかのケースでは、適切なバイトスライス buf
で utf8.EncodeRune(buf, x)
を呼び出すことが正しい解決策かもしれません. 他のコードでは strconv.Itoa
や fmt.Sprint
を使用しなければならないでしょう.
この新しい vet チェックは、go test
を使用するときにデフォルトで有効になっています.
私たちは、Go の将来のリリースでこの変換を禁止することを検討しています. つまり、x
の型が rune
か byte
である整数 x
に対してのみ string(x)
が許されるように言語が変更されます. そのような言語の変更は後方互換性がありません. 私達は言語を変更するための最初の試験的なステップとして、この vet チェックを使用しています.
不可能なインターフェース変換への新しい警告
あるインターフェイス型から別のインターフェイス型への常に失敗する型アサーションについて、vet ツールは警告するようになりました. これは両方のインターフェース型が違う型シグネチャの同じ名前のメソッドを実装している場合に発生します.
常に失敗する型アサーションを書く理由はないので、この vet チェックを引き起こすコードはすべて書き換えるべきです.
この新しい vet チェックは、go test
を使用するときにデフォルトで有効になっています.
Go の将来のリリースでは、不可能なインターフェイスの型アサーションを禁止することを検討しています. そのような言語の変更は後方互換性がありません. 私達は言語を変更するための最初の試験的なステップとして、この vet チェックを使用しています.
ランタイム
bool
, complex64
, complex128
, float32
, float64
, int
, int8
, int16
, int32
, int64
, string
, uint
, uint8
, uint16
, uint32
, uint64
, uintptr
の派生型の値で panic
を発生させた場合、そのアドレスの代わりに値が表示されるようになりました. 以前は正確にこれらの型の値の場合にのみ値が表示されていました.
Unix システム上で、kill
コマンドまたは kill
システムコールが SIGSEGV
、SIGBUS
、SIGFPE
シグナルを Go プログラムに送信するために使用され、そのシグナルが os/signal.Notify
でハンドルされていない場合、Go プログラムは確実にスタックトレース有りでクラッシュするようになりました. 以前のリリースでは、挙動が予測不可能でした.
スモールオブジェクトの割り当ては、コア数が多い場合のパフォーマンスがずっと良くなり、ワーストケースのレイテンシもより低くなりました.
小さな整数値をインターフェイス値に変換してもアロケーションが発生しなくなりました.
閉じたチャンネルでのノンブロッキング受信が、開いているチャンネルでのノンブロッキング受信と同じ動作をするようになりました.
コンパイラ
パッケージ unsafe
の 安全規則 は特定の関数を呼び出す際に unsafe.Pointer
を uintptr
に変換することを許しています. 以前は、いくつかのケースで、コンパイラは複数の連鎖変換を許可していました(例えば、syscall.Syscall(…, uintptr(uintptr(ptr)), …)
). コンパイラは今や正確に1つの変換であることを求めます. 複数の変換を使用していたコードは、安全規則を満たすように更新する必要があります.
Go 1.15 では、特定のタイプの GC メタデータを削除し、未使用の型メタデータをより積極的に削除することで、典型的なバイナリサイズを Go 1.14 と比較して約5%削減しました.
ツールチェーンは、関数を32バイト境界に揃え、ジャンプ命令をパディングすることによって、GOARCH=amd64
上で Intel CPU erratum SKX102 を緩和するようになりました. このパディングによりバイナリサイズが増加しますが、上述のバイナリサイズの改善により埋め合わせています.
Go 1.15 では、コンパイラとアセンブラの両方に -spectre
フラグが追加され、Spectre の緩和が有効にできるようになりました. これらはほとんど必要ないはずですが、主に "defense in depth" メカニズムとして提供されています. 詳細については Spectre wiki page を参照してください。
コンパイラは、それらが適用される宣言にとって意味のない //go:
コンパイラディレクティブを、"misplaced compiler directive" エラーとして拒否するようになりました. そのような誤って適用されたディレクティブは以前から壊れていましたが、コンパイラによって無言で無視されていました.
コンパイラの -json
最適化ロギングは、大きな (128バイト以上) コピーを報告するようになり、エスケープ解析の判断の説明を含むようになりました.
リンカ
このリリースには、リンカのリソース使用量(時間とメモリの両方)を削減し、コードの堅牢性/保守性を向上させる、Go リンカへの大幅な改良が含まれています.
大規模な Go プログラムの代表的なセットでは、amd64
アーキテクチャ上で動作する ELF
ベースの OS (Linux, FreeBSD, NetBSD, OpenBSD, Dragonfly, および Solaris) の場合、リンクは 20% 高速化され、必要とするメモリは平均で 30% 少なくなり、他のアーキテクチャ/OSの組み合わせではもう少し控えめな改善となります.
リンカの性能向上の主要因は、新しく再設計されたオブジェクトファイル形式や、同時実行性を高めるための内部フェーズの見直しです(例えば、シンボルへの再配置を並行して適用する). Go 1.15 のオブジェクトファイルは、1.14 のものよりも若干大きくなっています.
これらの変更は Go リンカの近代化 のためのマルチリリースプロジェクトの一部であり、将来のリリースではさらなるリンカの改良が期待できます.
リンカは linux/amd64
と linux/arm64
で内部リンクモードとして -buildmode=pie
をデフォルトとしたので、これらの構成では C リンカを必要としなくなりました. 外部リンクモード(Go 1.14では -buildmode=pie
がデフォルトでした)は、-ldflags=-linkmode=external
フラグを使って引き続き要求することができます.
Objdump
objdump ツールは -gnu
フラグで、GNU アセンブラ構文での逆アセンブルをサポートするようになりました.
コアライブラリ
新しい tzdata 埋め込みパッケージ
Go 1.15 には、タイムゾーンデータベースをプログラムに埋め込むことができる新しいパッケージ、time/tzdata
が含まれています. (import _ "time/tzdata"
のように)このパッケージをインポートすると、ローカルシステム上にタイムゾーンデータベースがない場合でも、プログラムがタイムゾーン情報を見つけることができます. -tags timetzdata
を付けてビルドすることによってでもタイムゾーンデータベースを埋め込むことができます. どちらのやり方でも、プログラムのサイズは約 800KB 増加します.
Cgo
Go 1.15 では、C言語型の EGLConfig
が Go 言語型の uintptr
に変換されます. この変更は Go 1.12 以降の EGLDisplay
や Darwin の CoreFoundation や Java の JNI 型の扱い方に似ています. 詳細は cgo のドキュメント を参照してください.
X.509 CommonName の廃止
Subject Alternative Names が存在しない場合、X.509 証明書の CommonName
フィールドをホスト名として扱うという非推奨でレガシーな挙動がデフォルトで無効になりました. GODEBUG
環境変数に x509ignoreCN=0
の値を追加することで、一時的に再度有効にすることが可能です.
GODEBUG
の設定に関わらず CommonName
が無効なホスト名の場合、常に無視されることに注意してください. 無効な名前には英字、数字、ハイフン、アンダースコア以外の文字や空のラベルや末尾にドットがあるものが含まれます.
ライブラリへの小さな変更
いつものように、Go 1の 互換性の約束を念頭に置いて行われた、ライブラリに対するさまざまな小さな変更と更新があります.
bufio
Scanner
が無効な io.Reader
と一緒に使用され、Read
から誤って負の数を返す場合、Scanner
は panic にならず、代わりに新しいエラー ErrBadReadCount
を返すようになります.
context
nil の親を使用して派生 Context
を作成することが明示的に禁止されるようになりました. WithValue
、WithDeadline
、WithCancel
関数を使用してこれを行おうとすると、パニックを引き起こします.
crypto
crypto/rsa
、crypto/ecdsa
、crypto/ed25519
パッケージの PrivateKey
、PublicKey
型に鍵の等価性を比較したり、公開鍵の型安全インタフェースを作成するための Equal
メソッドが追加されました. このメソッドのシグネチャは、go-cmp
の等価の定義と互換性があります.
Hash
は fmt.Stringer
を実装しました.
crypto/ecdsa
新しい SignASN1
関数と VerifyASN1
関数は、標準 ASN.1 DER エンコーディングでECDSA 署名を生成し、検証することを可能にします.
crypto/elliptic
新しい MarshalCompressed
関数と UnmarshalCompressed
関数は圧縮形式での NIST 楕円曲線点のエンコードとデコードを可能にします.
crypto/rsa
VerifyPKCS1v15
は RFC 8017 に従って、先頭のゼロが欠落している無効な短い署名を拒否するようになりました.
crypto/tls
新しい Dialer
型とその DialContext
メソッドにより、コンテキストを使用して TLS サーバとの接続とハンドシェイクの両方を行うことができます.
Config
型の新しい VerifyConnection
コールバックにより、すべての接続に対してカスタム検証ロジックを適用することができます. このコールバックでは、ピア証明書、SCT、ステープルされた OCSP レスポンスを含む ConnectionState
にアクセスすることができます.
自動生成されたセッションチケットの鍵は、forward secrecy への影響を制限するために、24時間ごとに自動的にローテーションされ、有効期限は7日間となりました.
接続の再開で再利用されるセッションキーである、TLS 1.2 およびそれ以前のバージョンのセッションチケットの寿命は forward secrecy への影響を制限するため、同様に7日に制限されました.
RFC 8446 で規定されているクライアント側のダウングレード保護チェックが実施されるようになりました. これにより、許可されていないダウングレード攻撃のような動作をするミドルボックスに遭遇したクライアントが接続エラーを起こす可能性があります。
SignatureScheme
、CurveID
、ClientAuthType
が fmt.Stringer
を実装しました.
ConnectionState
のフィールド OCSPResponse
と SignedCertificateTimestamps
がクライアント側の再開された接続で再設定されるようになりました.
tls.Conn
は、恒久的に壊れた接続に対して、一時的な net.Error
をラップした不明瞭なエラーを返すようになりました. もとの net.Error
にアクセスするのには、型アサーションではなく errors.As
(または errors.Unwrap
) を使います.
crypto/x509
証明書上の名前または (VerifyOptions.DNSName
や VerifyHostname
で) 検証されている名前のいずれかが無効な場合、それ以上の処理なしに大文字小文字を区別せずに比較されます(ワイルドカードを無視したり、末尾のドットを除去したりすることはありません). 無効な名前には、英字、数字、ハイフン、アンダースコア以外の文字、空のラベルを持つ名前、証明書の名前で末尾にドットがあるものが含まれます.
新しい CreateRevocationList
関数と RevocationList
型により、RFC 5280 準拠の X.509 v2 証明書失効リストを作成できるようになりました.
CreateCertificate
はテンプレートが CA で SubjectKeyId
が明示的に指定されていない場合、自動で生成するようになりました.
CreateCertificate
は、テンプレートが MaxPathLen
を指定しているが CA ではない場合に、エラーを返すようになりました.
macOS 以外の Unix システムで、SSL_CERT_DIR
環境変数をコロン区切りリストにできるようになりました.
macOS では、cgo が利用可能かどうかに関わらず、システムのトラストルートを取り出すために、バイナリは常に Security.framework
に対してリンクされるようになりました. 結果として OS のベリファイアとより一貫した動作をするようになりました.
crypto/x509/pkix
ExtraNames
が nil の場合、Name.String
は Names
から非標準属性を表示するようになりました.
database/sql
新しい DB.SetConnMaxIdleTime
メソッドは、コネクションが一定期間アイドル状態になった後に、コネクションの総ライフスパンに関係なくコネクションプールからコネクションを削除することができます. DBStats.MaxIdleTimeClosed
フィールドは DB.SetConnMaxIdleTime
によってクローズされた接続の総数を示します.
新しい Row.Err
ゲッターにより、Row.Scan
を呼ばずにクエリエラーをチェックできるようになりました.
database/sql/driver
新しい Validator
インターフェイスは Conn
によって実装され、接続が有効かどうか、または破棄すべきかどうかをドライバがシグナルすることができるようになります.
debug/pe
PE ファイル形式で使われる定数 IMAGE_FILE
、IMAGE_SUBSYSTEM
、IMAGE_DLLCHARACTERISTICS
が定義されました.
encoding/asn1
Marshal
は X.690 DER に従って SET OF の構成要素をソートするようになりました.
Unmarshal
は、X.690 DER に従って最小エンコードされていないタグとオブジェクト識別子を拒否するようになりました.
encoding/json
デコード時のネスティングの最大の深さに内部的な制限を持つようになりました. これにより、深くネストされた入力が大量のスタックメモリを使用したり、"goroutine stack exceeds limit" パニックが発生したりする可能性が減りました.
Unmarshal
は、encoding.TextUnmarshaler
を実装した文字列型のマップキーをサポートするようになりました
flag
flag
パッケージが -h
や -help
を見て、それらのフラグが定義されていない場合、使用状況のメッセージを表示するようになりました. FlagSet
が ExitOnError
で作成された場合、FlagSet.Parse
はステータス 2 で終了します. このリリースでは、-h
や -help
の終了ステータスが 0 に変更されました. 特にこれはコマンドラインフラグのデフォルト処理に適用されます.
fmt
表示動詞 %#g
と %#G
は、浮動小数点値の末尾のゼロを維持するようになりました.
go/format
Source
関数と Node
関数は、Goソースコードのフォーマットの一部として、数値リテラルの接頭辞と指数を正規化するようになりました. これは、Go 1.13 以降に実装された gofmt
コマンドの動作と一致しています.
html/template
すべての JavaScript と JSON のコンテキストで Unicode エスケープ (\uNNNN
) を使用するようになりました. これにより application/ld+json
と application/json
のコンテキストでのエスケープエラーが修正されました.
io/ioutil
TempDir
と TempFile
はパス区切り文字を含むパターンを拒否するようになりました. つまり、ioutil.TempFile("/tmp",
"../base*")
のような呼び出しは成功しなくなりました. これにより、意図しないディレクトリトラバーサルを防ぐことができます.
math/big
新しい Int.FillBytes
メソッドにより固定サイズのあらかじめ割り当てられたバイトスライスにシリアライズすることができるようになりました.
math/cmplx
本パッケージの関数は、無限大、NaN、符号付きゼロなどの特殊な引数の取り扱いに関して、C99 標準(Annex G IEC 60559 互換複素数演算)に準拠するように更新されました.
net
I/O 操作が Conn.SetDeadline
メソッド、Conn.SetReadDeadline
メソッド、Conn.SetWriteDeadline
メソッドによって設定されたデッドラインを超えると、os.ErrDeadlineExceeded
をラップしたエラーを返すようになりました. これによりエラーが期限を超えたことによるものかどうかを確実に検出することができます. 以前のリリースでは、エラーが発生した際に Timeout
メソッドを呼び出すことを推奨していましたが、 期限を超えていないにもかかわらず Timeout
が true
を返すエラーをI/O 操作が返すことがあります.
新しい Resolver.LookupIP
メソッドは、ネットワーク固有の IP ルックアップとコンテキストを受け入れる IP ルックアップの両方をサポートしています.
net/http
HTTP Request Smuggling 攻撃が難しくなるようにパースがより厳格になりました. SP や HTAB のように非 ASCII ホワイトスペースはトリムされなくなり、"identity
" Transfer-Encoding
のサポートが削除されました.
net/http/httputil
ReverseProxy
は、入ってくる Request.Header
マップエントリの X-Forwarded-For
フィールドを nil
とすることによって、X-Forwarded-For
を変更しないことをサポートするようになりました.
ReverseProxy
によってハンドルされた Switching Protocol (WebSocket のような) リクエストがキャンセルされた場合、バックエンド接続が正しく閉じられるようになりました.
net/http/pprof
すべてのプロファイルエンドポイントが "seconds
" パラメータをサポートするようになりました. 与えられた場合、エンドポイントは指定された秒数分のプロファイルを行い、その差分をレポートします. cpu
プロファイルとトレースエンドポイントの "seconds
" パラメータの意味は変更されていません.
net/url
新しい URL
フィールド RawFragment
とメソッド EscapedFragment
は、特定のフラグメントの正確なエンコーディングについての詳細と制御を提供します. これらは RawPath
と EscapedPath
に類似しています.
新しい URL
のメソッド Redacted
は、どのパスワードも xxxxx
に置き換えた文字列形式の URL を返します.
os
I/O 操作が File.SetDeadline
メソッド、File.SetReadDeadline
メソッド、File.SetWriteDeadline
メソッドによって設定されたデッドラインを超えると、os.ErrDeadlineExceeded
をラップしたエラーを返すようになりました. これによりエラーが期限を超えたことによるものかどうかを確実に検出することができます. 以前のリリースでは、エラーが発生した際に Timeout
メソッドを呼び出すことを推奨していましたが、 期限を超えていないにもかかわらず Timeout
が true
を返すエラーをI/O 操作が返すことがあります.
パッケージ os
と net
は、EINTR
で失敗したシステムコールを自動的に再試行するようになりました. 以前はこれが原因で偽のエラーが発生していましたが、Go 1.14 では非同期の先取り機能が追加されたことで、より一般的になりました. これが今や透過的に処理されるようになりました.
os.File
型が ReadFrom
メソッドをサポートするようになりました. これにより、ある os.File
から別の os.File
にデータをコピーするために io.Copy
を使用する際に、一部のシステムで copy_file_range
システムコールを使用できるようになりました. 結果として、io.CopyBuffer
は os.File
にコピーするときに提供されたバッファを常に使用するとは限りません. プログラムが提供されたバッファを強制的に使用したい場合は、io.CopyBuffer(struct{ io.Writer }{dst}, src, buf)
と書くことによって可能です.
plugin
macOS 上の -buildmode=plugin
で DWARF の生成がサポートされました(デフォルトで有効になっています).
freebsd/amd64
で -buildmode=plugin
でのビルドがサポートされました.
reflect
パッケージ reflect
は、以前はエクスポートされていない埋め込みフィールドへのアクセスを許可していましたが、エクスポートされていないすべてのフィールドのメソッドへのアクセスを禁止するようになりました. 以前の動作に依存しているコードは、代わりに取り囲む変数に対応する昇格メソッドにアクセスするように更新する必要があります.
regexp
新しい Regexp.SubexpIndex
メソッドは、正規表現内で指定された名前の最初のサブ式のインデックスを返します.
runtime
ReadMemStats
と GoroutineProfile
を含むいくつかの関数は、ガベージコレクションが進行中であってもブロックしなくなりました.
runtime/pprof
goroutine プロファイルはプロファイリング時に各 goroutine に関連付けられたプロファイルラベルを含むようになりました. この機能は debug=2
で報告されるプロファイルにはまだ実装されていません.
strconv
複素数を扱うための FormatComplex
と ParseComplex
が追加されました.
FormatComplex
は、複素数を a と b を実数と虚数のパートとする (a+bi) 形式の文字列に変換します.
ParseComplex
は文字列を指定した精度の複素数に変換します. ParseComplex
は、N+Ni
の形式の複素数を受け付けます.
sync
新しいメソッド Map.LoadAndDelete
は、アトミックにキーを削除し、存在する場合は前の値を返します。
Map.Delete
メソッドはより効率的になりました.
syscall
Unix システムでは、SysProcAttr
を使用する関数は、どちらも Ctty
フィールドを使用していますが、互換性のない方法で使用しているので、Setctty
フィールドと Foreground
フィールドの両方を設定しようとする試みを拒否するようになりました. 既存のプログラムで両方のフィールドを設定することはほとんどないと想定しています.
Setctty
フィールドを設定するには、ProcAttr.Files
フィールドによって決定されるように、Ctty
フィールドを子プロセスのファイル記述子番号に設定する必要があります. 子ディスクリプタを使用すると常に動作しますが、親ファイルディスクリプタを使用するとたまたま動作する場合がありました. Setctty
を設定するプログラムの中には、子ディスクリプタ番号を使用するために Ctty
の値を変更する必要があるものがあります.
windows/amd64
で浮動小数点数の値を返すシステムコールを呼び出すことができるようになりました.
testing
testing.T
型にテストバイナリがタイムアウトを超過した時間を報告するためのDeadline
メソッドが追加されました.
TestMain
関数はos.Exit
を呼び出す必要がなくなりました. TestMain
関数から戻ったとき、テストバイナリはm.Run
によって返された値を使ってos.Exit
を呼び出します.
新しいメソッドT.TempDir
とB.TempDir
は、テスト終了時に自動的にクリーンアップされる一時ディレクトリを返します.
go test -v
テスト名を各行に表示するのではなく、テスト名によって出力をグループ化するようになりました.
text/template
JSEscape
は JSON と互換性のある Unicode エスケープ (\u00XX
) を一貫して使うようになりました.
time
新しいメソッドTicker.Reset
はティッカーの期間の変更をサポートしています。
エラーを返すときに、ParseDuration
が元の値を引用するようになりました.