この記事は https://golang.org/doc/go1.16 を日本語訳したものです. 前のバージョンはこちら: Go 1.15 リリースノート.
Go 1.16 の紹介
最新の Go リリース、バージョン 1.16 は、Go 1.15 から6か月後に届きます. その変更点のほとんどは、ツールチェーン、ランタイム、およびライブラリの実装になります. いつものように、このリリースは Go 1 の互換性の約束を守っています. 私たちは、ほとんどすべての Go プログラムが以前と同じようにコンパイルし実行し続けれると予想しています.
言語への変更
言語の変更はありません.
ポート
Darwin と iOS
Go 1.16 は GOOS=darwin
と GOARCH=arm64
で (Apple シリコンとして知られる) macOS の 64bit ARM アーキテクチャのサポートを追加します. darwin/amd64
ポートのように、darwin/arm64
ポートは cgo、内部及び外部リンク、c-archive
や c-shared
や pie
ビルドモード、そして競合検出器をサポートします.
以前は darwin/arm64
だった iOS ポートは ios/arm64
にリネームされました. GOOS=android
が linux
ビルドタグを意味するように、GOOS=ios
は darwin
ビルドタグを意味します. この変更は iOS アプリをビルドするために gomobile を使用するどの人にも透明なはずです.
GOOS=ios
の導入により、x_ios.go
のようなファイル名は GOOS=ios
に対してのみビルドされるようになりました. 詳細は go help buildconstraint
を参照してください. この形式のファイル名を使用している既存のパッケージはファイル名を変更する必要があります.
Go 1.16 は AMD64 ベースの macOS 上で動作する iOS シミュレータをターゲットとする ios/amd64
ポートを追加しました. 以前にこれは ios
ビルドタグをセットした darwin/amd64
を通して非公式にサポートされていました. iOS と iOS シミュレータのためのプログラムのビルド方法の詳細については misc/ios/README
も参照してください.
Go 1.16 は macOS 10.12 Sierra で動作する最後のリリースです. Go 1.17 は macOS 10.13 High Sierra 以降が必要です.
NetBSD
Go は NetBSD で 64 ビット ARM アーキテクチャをサポートするようになりました(netbsd/arm64
ポート).
OpenBSD
Go は OpenBSD で MIPS64 アーキテクチャをサポートするようになりました(openbsd/mips64
ポート). このポートはまだ cgo をサポートしていません.
OpenBSD の 64bit x86 及び ARM アーキテクチャ(openbsd/amd64
と openbsd/arm64
ポート)は SYSCALL/SVC
命令を直接使うのではなく、libc
を通してシステムコールをするようになりました. このことは、将来のバージョンの OpenBSD との前方互換性を保証します. 特に、OpenBSD 6.9 以降では、スタティックではない Go バイナリは libc
を通したシステムコールが必要となります.
386
Go 1.15 のリリースノートでアナウンスしたように、Go 1.16 は x87 モードのコンパイル(GO386=387
)のサポートを止めます. SSE2 を持たないプロセッサのサポートにはソフト浮動小数点モード(GO386=softfloat
)が利用可能です. SSE2 を持たないプロセッサで走らせるユーザは GO386=softfloat
で GO386=387
を置き換える必要があります.
RISC-V
linux/riscv64
ポートは cgo と -buildmode=pie
をサポートするようになりました. 今回のリリースには、RISC-V のパフォーマンスの最適化とコード生成の改善も含まれています.
ツール
Go コマンド
モジュール
モジュール認識モードは、現在のワーキングディレクトリやパレントディレクトリに go.mod
ファイルがあるかどうかに関係なく、デフォルトで有効になりました. より正確には、GO111MODULE
環境変数のデフォルトが on
になりました. 以前の挙動に切り替えるには、GO111MODULE
を auto
に設定してください.
go build
や go test
などのビルドコマンドは、デフォルトでは go.mod
や go.sum
を変更しなくなりました. その代わりに、モジュールの要件やチェックサムを追加したり更新したりする必要がある場合にエラーを報告するようになりました(まるで -mod=readonly
フラグが設定されているかのように). モジュールの要件やチェックサムは、go mod tidy
や go get
で調整することができます.
go install
はバージョンサフィックスを持つ引数を受け入れるようになりました(例えば、go install example.com/cmd@v1.0.0
). これにより、go install
はカレントディレクトリや親ディレクトリがあればそれを無視して、モジュール認識モードでパッケージをビルド、インストールします. これは、メインモジュールの依存関係に影響を与えずに実行可能ファイルをインストールするのに便利です.
(上で説明した)バージョンサフィックスの有無に関わらず、go install
はモジュールモードでパッケージをビルドしてインストールするための推奨される方法になりました. パッケージをビルドせずに現在のモジュールの依存関係を調整するには go get
を -d
フラグと一緒に使うべきで、go get
でパッケージをビルドしてインストールすることは非推奨となりました. 将来のリリースでは、-d
フラグは常に有効になります.
モジュールのある公開されたバージョンを、他のモジュールで使用してはいけないことを示すために retract
ディレクティブを go.mod
ファイルの中でしようできるようになりました. モジュールの作者は、深刻な問題が発見された後や、意図せずに公開されたときにバージョンを引っ込めることができます.
go mod vendor
や go mod tidy
サブコマンドは、不足しているパッケージの解決でエラーが発生しても続行するように指示する、-e
フラグを受け入れるようになりました.
go
コマンドは、メインモジュールの exclude
ディレクティブによって除外されたモジュールのバージョンの要件を無視するようになりました. 以前は go
コマンドは除外されたバージョンより高い次のバージョンを使用していましたが、そのバージョンは時間の経過とともに変化する可能性があり、結果として再現性のないビルドになっていました.
モジュールモードでは、go
コマンドは、非 ASCII 文字や先頭がドット文字(.
)であるパス要素を含むインポートパスを禁止するようになりました. これらの文字を含むモジュールパスは既に禁止されています(モジュールパスとバージョンを参照してください). ですので、この変更はモジュールのサブディレクトリ内のパスにのみ影響します.
埋め込みファイル
go
コマンドは、新しい //go:embed
ディレクティブを使用することによって、静的ファイルやファイルツリーを最終的な実行ファイルの一部に含むことをサポートしました. 詳細については新しい embed
パッケージのドキュメントを参照してください.
go test
go test
を使用する場合、テスト関数の実行中に os.Exit(0)
を呼び出すテストは失敗と見做されるようになりました. これは、テストが os.Exit(0)
を呼び出すコードを呼び出し、それによって将来のすべてのテストの実行を停止してしまうケースをキャッチするのに役立ちます. TestMain
関数が os.Exit(0)
を呼んだ場合、それはまだテストを通過したと見做されます.
go test
は -c
または -i
フラグと不明なフラグを同時に使用した場合、エラーを報告するようになりました. 通常、不明なフラグはテストに渡されますが、-c
や -i
が使われている場合にはテストは実行されません.
go get
go get -insecure
フラグは非推奨となり、将来のバージョンでは削除される予定です. このフラグは、HTTP のような安全でないスキームを使ってリポジトリから取得したり、カスタムドメインを解決することを許可し、またチェックサムデータベースを使ったモジュールのチェックサム検証をバイパスします. 安全でないスキームの使用を許可するには、代わりに環境変数 GOINSECURE
を使用します. モジュールのチェックサムの検証をバイパスするには、GOPRIVATE
か GONOSUMDB
を使います. 詳細については go help environment
を参照してください.
go get example.com/mod@patch
は example.com/mod
のあるバージョンがすでにメインモジュールで必要とされていることを要求するようになりました. (ただし、go get -u=patch
は新しく追加された依存関係にもパッチを適用し続けます.)
GOVCS
環境変数
GOVCS
は、go
コマンドがソースコードをダウンロードする際に使用するバージョン管理ツールを制限する、新しい環境変数です. これにより、通常は信頼された認証済みの環境で使用されるツールのセキュリティの問題が緩和されます. デフォルトでは、git
や hg
はどのリポジトリからでもコードをダウンロードできるようになっています. svn
や bzr
や fossil
は、GOPRIVATE
環境変数のパターンにマッチするモジュールパスやパッケージパスを持つリポジトリからのみコードをダウンロードすることができます. 詳細については go help vcs
を参照してください.
all
パターン
メインモジュールの go.mod
ファイルが go 1.16
以降を宣言している場合、all
パッケージパターンは、メインモジュールで見つかったパッケージやテストによって遷移的にインポートされたパッケージのみにマッチするようになりました. (メインモジュールでインポートされたパッケージのテストでインポートされたパッケージは含まれなくなりました.) これは Go 1.11 以降、go mod vendor
が保持しているパッケージのセットと同じです.
-toolexec
ビルドフラグ
コンパイルやアセンブルのようなツールチェーンプログラムを起動する際、プログラムを使うために -toolexec
ビルドフラグが指定された場合、TOOLEXEC_IMPORTPATH
環境変数にビルド中のパッケージのインポートパスが設定されるようになりました.
-i
ビルドフラグ
go build
や go install
や go test
で受け入れられていた -i
フラグは非推奨になりました. -i
フラグは、コマンドラインで指定されたパッケージによってインポートされたパッケージをインストールするように go
コマンドに指示します. Go 1.10 でビルドキャッシュが導入されて以降、-i
フラグはビルド時間に大きな影響を与えなくなり、インストールディレクトリが書き込み可能でない場合にエラーを引き起こすだけでした.
list
コマンド
-export
フラグが指定された場合、BuildID
フィールドにコンパイルされたパッケージのビルド ID がセットされるようになりました.
これは go list -exported -f {{.Export}}
で go tool buildid
を実行するのと同じですが、追加のステップがありません.
-overlay
フラグ
-overlay
フラグは、ファイルパスの置換セットを含む JSON 設定ファイルを指定します. -overlay
フラグはすべてのビルドコマンドと go mod
サブコマンドで使用できます. これは gopls のようなエディタツールがソースファイルへの未保存の変更の影響を理解するために使われることを主眼としています. 設定ファイルは実際のファイルパスを置換ファイルパスにマッピングし、go
コマンドとそのビルドは、実際のファイルパスが置換ファイルパスによって与えられた内容を持って存在するか、置換ファイルパスが空の場合は存在しないかのように実行されます.
Cgo
cgo ツールは、それらのサイズが Go で表現できる場合でも、C 構造体ビットフィールドを Go 構造体フィールドに変換することを試みないようになりました. C ビットフィールドがメモリに出現する順序は実装に依存しているため、cgo ツールが静かに誤った結果を生成することがありました.
Vet
goroutines の中での無効な testing.T の使用に対する新しい警告
vet ツールは、テスト中に作成された goroutine 内から testing.T
の Fatal
メソッドが不正に呼び出された場合に警告を表示するようになりました. これは testing.T
テストや testing.B
ベンチマークの Fatalf
や FailNow
や Skip{,f,Now}
メソッド呼び出しでもまた警告します.
これらのメソッドを呼び出すと、作成された goroutine の実行が停止され、Test*
や Benchmark*
関数の実行は停止されません. これらはテストやベンチマーク関数を実行している goroutine から呼び出される必須メソッドです. 例えば、
func TestFoo(t *testing.T) {
go func() {
if condition() {
t.Fatal("oops") // TestFoo の代わりに内部の func を終了します.
}
...
}()
}
作成された goroutine から t.Fatal
(または同様のメソッド)を呼び出すコードは、t.Error
を使ってテストの失敗を知らせ、return
文を使うなどの代替手段を使って goroutine を早期に脱出するように書き換えるべきです. 先ほどの例は次のように書き換えることができます.
func TestFoo(t *testing.T) {
go func() {
if condition() {
t.Error("oops")
return
}
...
}()
}
フレームポインタに対する新しい警告
vet ツールは、呼び出し規約に反して、BP レジスタ(フレームポインタ)を保存して復元することなく、BP レジスタ(フレームポインタ)を壊してしまう amd64 アセンブリについて警告するようになりました. BP レジスタを保持しないコードは、BP を全く使わないか、保存して復元することで BP を保持するように修正しなければなりません. BP を保持する簡単な方法は、フレームサイズを0以外の値に設定することで、生成されたプロローグとエピローグがあなたのために BP レジスタを保持するようになります. 修正例については CL 248260 を参照してください.
asn1.Unmarshal に対する新しい警告
vet ツールは、ポインタでないものや nil な引数を asn1.Unmarshal
に誤って渡すことを警告するようになりました. これは、encoding/json.Unmarshal
や encoding/xml.Unmarshal
に対する既存のチェックのようなものです.
ランタイム
新しい runtime/metrics
パッケージは、Go ランタイムから実装定義のメトリクスを読み取るための安定したインターフェイスを導入しました. これは runtime.ReadMemStats
や debug.GCStats
のような既存の関数に取って代わる、大いに汎用的で効率的一般的で効率的なものです. 詳細はパッケージのドキュメントを参照してください.
GODEBUG
環境変数を inittrace=1
に設定すると、ランタイムは各パッケージ init
の実行時間とメモリ割り当てをまとめた1行を標準エラーをに出力するようになりました. このトレースは、Go の起動パフォーマンスのボトルネックやリグレッションを見つけるために使用できます. GODEBUG
ドキュメント に書式が記述されています.
Linuxでは、ランタイムはデフォルトで、オペレーティングシステムがメモリプレッシャーを受けているときに(MADV_FREE
を使用して)怠惰に実行するのではなく、(MADV_DONTNEED
を使用して)速やかにオペレーティングシステムにメモリを解放するようになりました. これは、RSS のようなプロセスレベルのメモリ統計が、Go プロセスが使用している物理メモリの量をより正確に反映することを意味します. 現在、GODEBUG=madvdontneed=1
を使用してメモリ監視の動作を改善しているシステムでは、この環境変数を設定する必要はもはやありません.
Go 1.16 では、競合検出器と Go メモリモデル の間の不一致が修正されました. 競合検出器は、メモリモデルのチャンネル同期ルールにより正確に従うようになりました. 結果として、以前は見逃していた競合を報告することができるようになりました.
コンパイラ
コンパイラはラベルのない for
ループ、メソッド値、型スイッチのある関数をインライン化できるようになりました. またインライン化可能な間接的な呼び出しもより検出できるようになりました.
リンカ
このリリースには、Go リンカへの追加の改良が含まれており、リンカのリソース使用量(時間とメモリの両方)を削減し、コードの堅牢性と保守性を改善しています. これらの変更は、Go リンカの近代化のための2つのリリースプロジェクトの後半を形成しています.
1.16 のリンカの変更点は、1.15 の改善を、サポートされているすべてのアーキテクチャ/OS の組み合わせに拡張したことです(1.15 のパフォーマンスの改善は、主に ELF
ベースの OS と amd64
アーキテクチャに焦点を当てていました). 大規模な Go プログラムの代表的なセットでは、リンクは 1.15 よりも 20-25% 速くなり、linux/amd64
では平均して 5-15% メモリ使用量が削減されており、他のアーキテクチャや OS では更に大きく改善されています. ほとんどのバイナリは、より積極的なシンボル刈り込みの結果として、より小さくなっています.
Windows において、go build -buildmode=c-shared
がデフォルトで Windows ASLR DLL を生成するようになりました. ASLR は --ldflags=-aslr=false
で無効にすることができます.
コアライブラリ
埋め込みファイル
新しい embed
パッケージは、新しい //go:embed
directive ディレクティブを使ってコンパイル時にプログラムに埋め込んだファイルへのアクセスを提供します.
ファイルシステム
新しい io/fs
パッケージは、ファイルの読み取り専用ツリーの抽象化である fs.FS
インターフェイスを定義しています. 標準のライブラリパッケージは、このインターフェースを適宜利用できるように作り変えられています.
生成側では、新しい embed.FS
型が、zip.Reader
がそうしているように、fs.FS
を実装しています. 新しい os.DirFS
関数はオペレーティングシステムファイルのツリーをバックにして、fs.FS
の実装を提供します.
消費側では、新しい http.FS
関数が fs.FS
を http.FileSystem
に変換します. また、html/template
と text/template
パッケージの ParseFS
関数とメソッドは、fs.FS
からテンプレートを読み込みます.
fs.FS
を実装したコードをテストするために、新しい testing/fstest
パッケージがよくある間違いをチェックして報告する TestFS
関数を提供します. また、fs.FS
の実装を受け付けるコードをテストするために有益なシンプルなインメモリファイルシステムの実装として、MapFS
を提供します.
io/ioutil の非推奨化
io/ioutil
パッケージは定義がイマイチで理解しにくいもののコレクションであることが判明しました. このパッケージが提供するすべての機能は他のパッケージに移されました. io/ioutil
パッケージは残り、今まで通り動作しますが、新しいコードでは io
と os
パッケージの新しい定義を使用することを推奨します.
こちらが io/ioutil
でエクスポートされていた名前の新しい場所のリストになります.
-
Discard
=>io.Discard
-
NopCloser
=>io.NopCloser
-
ReadAll
=>io.ReadAll
-
ReadDir
=>os.ReadDir
(注意:fs.FileInfo
のスライスではなくos.DirEntry
のスライスを返します) -
ReadFile
=>os.ReadFile
-
TempDir
=>os.MkdirTemp
-
TempFile
=>os.CreateTemp
-
WriteFile
=>os.WriteFile
ライブラリへの小さな変更
いつものように、Go 1 の 互換性の約束を念頭に置いて行われた、ライブラリに対するさまざまな小さな変更と更新があります.
archive/zip
新しい Reader.Open
メソッドが fs.FS
インターフェースを実装しました.
crypto/dsa
crypto/dsa
パッケージが非推奨になりました. issue #40337 も参照してください.
crypto/hmac
New
は、ハッシュ生成関数への個別の呼び出しが新しい値を返すのに失敗した場合にパニックするようになりました. 以前は挙動が未定義であり、無効な出力が生成されることがありました.
crypto/tls
閉じようとしている TLS 接続、または閉じた TLS 接続の I/O 操作は、新しい net.ErrClosed
エラーを使用して検出できるようになりました. 典型的な使用法は errors.Is(err, net.ErrClosed)
です.
Conn.Close
に、無期限にブロックされるのを防ぐために、"close notify" アラートを送信する前のデフォルトの書き込み期限が設定されました.
クライアントは、クライアントによってアドバタイズされたリスト にない ALPN プロトコル をサーバが選択した場合、ハンドシェイクエラーを返すようになりました.
サーバは、クライアントまたはサーバが AES ハードウェアをサポートしていなかったり、Config.PreferServerCipherSuites
と Config.CipherSuites
の両方が設定されていない場合、AES-GCM 暗号スイートの代わりに(ChaCha20Poly1305 のような)利用可能な他の AEAD 暗号スイートを優先するようになりました. クライアントが AES-GCM 暗号スイートの優先を合図していない場合は、AES ハードウェアをサポートしていないと見なされます.
Config.Clone
はレシーバが nil の場合にパニックせずに nil を返すようになりました.
crypto/x509
GODEBUG=x509ignoreCN=0
フラグは、Go 1.17 で削除されます. これにより、Subject Alternative Names が存在しない場合に X.509 証明書の CommonName
フィールドをホスト名として扱うという従来の動作が可能となっていました.
ParseCertificate
と CreateCertificate
は DNSNames
、EmailAddresses
、URIs
フィールドに文字列エンコーディングの制限を適用するようになりました. これらのフィールドは、ASCII 範囲内の文字列のみ含むことができます.
CreateCertificate
は、署名者の公開鍵を使用して生成された証明書の署名を検証するようになりました. 署名が無効な場合は、不正な証明書の代わりに、エラーが返されます.
DSA 署名検証がサポートされなくなりました. DSA 署名生成は既にサポートされていないことに注意してください. issue #40337 を参照してください.
Windows で、Certificate.Verify
は、最高ランクのチェーンだけではなく、プラットフォーム証明書検証器によって構築されたすべての証明書チェーンを返すようになりました.
新しい SystemRootsError.Unwrap
メソッドは、errors
パッケージ関数を通して、Err
フィールドへのアクセスを提供するようになりました.
Unix システムで、crypto/x509
パッケージは、システム証明書プールのコピーを保存する方法がより効率的になりました. 少数のルート証明書のみを使用するプログラムは、約 0.5 メガバイトメモリ使用量が少なくなります.
debug/elf
encoding/asn1
Unmarshal
と UnmarshalWithParams
は、引数がポインタでないか nil である場合にパニックするのではなく、エラーを返すようになりました. この変更は encoding/json
のような他のエンコーディングパッケージの挙動と一致しています.
encoding/json
Marshal
、Unmarshal
および関連機能によって理解される json
構造体フィールドタグは、Go 構造体フィールドの JSON オブジェクト名内でセミコロン文字を許可するようになりました.
encoding/xml
エンコーダは、XML 仕様で予約されている、xml
で始まる名前空間接頭辞の使用を回避するように常に注意してきました. 今や、仕様にぴったり従うように、このチェックが大文字小文字を区別しないようになったため、XML
や XmL
などで始まる接頭辞も回避するようになりました.
flag
新しい Func
関数は、Value
インターフェースを実装する軽量な代替として、関数を呼び出すことによって実装されたフラグの登録を提供します.
go/build
Package
構造体には、パッケージ内の //go:embed
ディレクティブに関する情報を報告する新しいフィールドがあります. EmbedPatterns
、EmbedPatternPos
、TestEmbedPatterns
、TestEmbedPatternPos
、XTestEmbedPatterns
、XTestEmbedPatternPos
です.
Package
フィールドの IgnoredGoFiles
は、"_" または "." で始まるファイルを含まなくなります. IgnoredGoFiles
は、ビルドの制約のために無視されるファイルのためのものです.
新しい Package
フィールド IgnoredOtherFiles
は、ビルド制約のために無視される Go 以外のファイルのリストを持ちます.
html/template
新しい template.ParseFS
関数と template.Template.ParseFS
メソッドは template.ParseGlob
と template.Template.ParseGlob
のようなものですが、fs.FS
からテンプレートを読みます.
io
ReadSeekCloser
インターフェースが定義されました.
io/ioutil
パッケージ内の同じ名前の代わりに使うための、Discard
や NopCloser
や ReadAll
がパッケージに定義されました.
log
新しい Default
関数はデフォルト Logger
へのアクセスを提供します.
log/syslog
Writer
は、カスタム Unix ドメインソケットにロギングする際に、デフォルトのログソケットで既に使用されているフォーマットに合わせて、(ホスト名を省略し、より短いタイムスタンプを使用する)ローカルメッセージのフォーマットを使用するようになりました.
mime/multipart
Reader
の ReadForm
メソッドは、制限として int64 の最大値を渡したときでも、フォームデータを拒否しなくなりました.
net
閉じようとしているネットワーク接続、または I/O が完了する前に閉じられたネットワーク接続の I/O 操作は、新しい ErrClosed
エラーを使用して検出できるようになりました. 典型的な使用法は errors.Is(err, net.ErrClosed)
です. 以前のリリースでは、このケースを確実に検出する唯一の方法は Error
メソッドが返す文字列と "use of closed network connection"
をマッチさせることでした.
以前の Go リリースでは、/proc/sys/net/core/somaxconn
で設定されている、Linux システム上のデフォルトの TCP リスナーバックログサイズは最大で 65535
に制限されていました, Linux カーネルバージョン 4.1 以上では、最大値は 4294967295
になりました.
Linux で、ホスト名検索は /etc/nsswitch.conf
が見つからない場合、/etc/hosts
をチェックする前に DNS を使用することはなくなりました. これは musl ベースのシステムでよく見られることで、Go プログラムがそれらのシステム上の C プログラムの動作と一致するようになりました.
net/http
net/http
パッケージで、リクエスト URL の Path
フィールドに加えて RawPath
フィールドからプレフィックスを削除するよう、StripPrefix
の動作が変更されました. 過去のリリースでは、Path
フィールドのみが削除されていたため、リクエスト URL にエスケープされた文字が含まれていた場合、URL は Path
と RawPath
フィールドが不一致になるように修正されていました. Go 1.16 では、StripPrefix
は両方のフィールドをトリミングします. リクエスト URL のプレフィックス部分にエスケープされた文字がある場合、ハンドラは以前の動作である Path
/RawPath
ペアが一致していないハンドラを呼び出す代わりに 404 を提供します.
net/http
パッケージは、例えば "Range": "bytes=--2"
のような "-N"
が負のサフィックス長の "Range": "bytes=--N"
形式の HTTP 範囲リクエストを拒否するようになりました. 今は 416 "Range Not Satisfiable"
応答を返します.
SameSiteDefaultMode
で設定されたクッキーは、値のない SameSite キーを生成するのではなく、現在の仕様(属性を設定しない)に従って動作するようになりました.
Client
は、既存の POST
と PUT
の動作にマッチするように、空のボディを持つ PATCH
リクエストで Content-Length: 0
ヘッダを明示的に送信するようになりました.
ProxyFromEnvironment
関数は、HTTPS_PROXY
が設定されていないときに、https://
URL のために HTTP_PROXY
環境変数の設定を返さなくなりました.
Transport
型は、CONNECT
リクエストの際にプロキシに送るヘッダを返す関数に設定することができる、新しいフィールド GetProxyConnectHeader
を持つようになりました. 事実上 GetProxyConnectHeader
は既存のフィールド ProxyConnectHeader
の動的バージョンで、GetProxyConnectHeader
が nil
でない場合は、ProxyConnectHeader
は無視されます.
新しい http.FS
関数は、fs.FS
を http.FileSystem
に変換します.
net/http/httputil
ReverseProxy
はボディ長が不明なストリームレスポンスを中継するとき、より積極的にバッファをフラッシュするようになりました.
net/smtp
Client
の Mail
メソッドは、アドレスが UTF-8 でエンコードされていることを示す、SMTPUTF8
ディレクティブをサポートするサーバに、それを送信するようになりました.
os
Process.Signal
は、プロセスが既に終了している場合に、エクスポートされていない errFinished
の代わりに ErrProcessDone
を返すようになりました.
パッケージに fs.DirEntry
のエイリアスとして、新しい DirEntry
型が定義されました. 新しい ReadDir
関数と、新しい File.ReadDir
メソッドは、ディレクトリの内容を DirEntry
のスライスに読み込むことに使用できます. File.Readdir
メソッド(dir
の小文字 d
に注意) はまだ存在し、FileInfo
のスライスを返しますが、ほとんどのプログラムでは File.ReadDir
に切り替えた方が効率的です。
io/ioutil
パッケージ内で定義されている関数の代わりに使うための、CreateTemp
、MkdirTemp
、ReadFile
、WriteFile
がこのパッケージに定義されました.
FileInfo
、FileMode
、PathError
の各型は、io/fs
パッケージ内の同名の型のエイリアスになりました. os
パッケージの関数シグネチャは、io/fs
パッケージの名前を参照するように更新されました. これが既存のコードに影響を与えることはありません.
新しい DirFS
関数は、オペレーティングシステムファイルのツリーをバックにした fs.FS
実装を提供します.
os/signal
新しい NotifyContext
関数は、特定のシグナルの到着時にキャンセルされるコンテキストの作成を提供します.
path
Match
関数は、パターンの未マッチ部分に構文エラーがある場合にエラーを返すようになりました. 以前は、関数はマッチの失敗時に早期に戻ったため、パターンの中のその後の構文エラーは報告されませんでした.
path/filepath
新しい関数 WalkDir
は Walk
に似ていますが、典型的にはより効率的です. WalkDir
に渡される関数は fs.FileInfo
の代わりに fs.DirEntry
を受け取ります. (Walk
関数が os.FileInfo
を受け取るものであったことを覚えている人のために明確にすると、os.FileInfo
は現在 fs.FileInfo
のエイリアスとなっています.)
Match
および Glob
関数は、パターンの非マッチ部分に構文エラーがある場合にエラーを返すようになりました. 以前は、関数はマッチに失敗した時点で早期に戻ったため、パターンの中のその後の構文エラーは報告されませんでした.
runtime/debug
SetPanicOnFault
が有効なときに使用される runtime.Error
値に Addr
メソッドが追加されました. そのメソッドが存在する場合、フォールトのトリガーとなったメモリアドレスを返します.
strconv
ParseFloat
は Eisel-Lemire アルゴリズムを使用するようになり、パフォーマンスが最大2倍改善しました. これにより、encoding/json
のようなテキスト形式のデコードも高速化されます,
syscall
NewCallback
と NewCallbackCDecl
は、複数のサブ uintptr
サイズの引数が一列に並んだコールバック関数を正しくサポートするようになりました. これにより、小さな引数間の手動のパディングを削除するために、これらの関数の使用法を変更する必要があるかもしれません.
Windows の SysProcAttr
が新しいプロセスの作成時にハンドルの継承を無効にする NoInheritHandles
を持つようになりました.
Windows の DLLError
は基礎となるエラーをアンラップするための Unwrap
メソッドを持つようになりました.
Linux で、Setgid
、Setuid
、および関連する呼び出しが実装されました. 以前、それらは syscall.EOPNOTSUPP
エラーを返していました.
Linux では、新しい AllThreadsSyscall
と AllThreadsSyscall6
関数を、プロセス内のすべての Go スレッドに対してシステムコールを行うことに使用できます. これらの関数は、cgo を使用していないプログラムでのみ使用でき、もしプログラムが cgo を使用していたら、それらは常に syscall.ENOTSUP
を返します.
testing/iotest
新しい ErrReader
関数は常にエラーを返す io.Reader
を返します.
新しい TestReader
関数は io.Reader
が正しく振る舞うかをテストします.
text/template
アクションの区切り文字の中で改行が許されるようになり、複数の行にまたがるアクションが許されるようになりました.
新しい template.ParseFS
関数と template.Template.ParseFS
メソッドは template.ParseGlob
と template.Template.ParseGlob
のようなものですが、fs.FS
からテンプレートを読みます.
text/template/parse
パースツリーに新しく CommentNode
が追加されました. parse.Tree
の中の Mode
フィールドがそれにアクセスすることを可能にしました.
time/tzdata
タイムゾーンデータベースとして、$GOROOT/lib/time/zoneinfo.zip
とこのパッケージ内の埋め込みコピーでスリムタイムゾーンデータ形式が使われるようになりました. これにより、タイムゾーンデータベースのサイズが約350KB削減されました.
unicode
unicode
パッケージとシステム全体の関連するサポートは、Unicode 12.0.0 から、5,930の新しい文字と、4つの新しいスクリプトと、55の新しい絵文字が追加された、Unicode 13.0.0 にアップグレードされました. また、Unicode 13.0.0 では第三漢字面として第三面(U+30000-U+3FFFF)を指定しています.