この記事は 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)を指定しています.