前書き
Go 1.16 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.16 Release Notes
次のバージョン:Go1.17のリリースノート(日本語訳)
前のバージョン:Go1.15のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.16の紹介
最新のGoリリースであるバージョン1.16は、Go 1.15 の6か月後に登場しました。変更のほとんどは、ツールチェーン、ランタイム、およびライブラリの実装にあります。いつものように、このリリースはGo 1の互換性の約束 を維持しています。ほとんどのGoプログラムは、これまで通りコンパイルおよび実行されることを期待しています。
言語の変更
言語に対する変更はありません。
Darwin と iOS
Go 1.16 では、macOS(Apple Silicon とも呼ばれる)上での 64 ビット ARM アーキテクチャのサポートが追加され、GOOS=darwin、GOARCH=arm64 の組み合わせで利用可能になりました。darwin/amd64 ポートと同様に、darwin/arm64 ポートも cgo、内部および外部リンク、c-archive、c-shared、pie ビルドモード、さらにレース検出器をサポートします。
以前は darwin/arm64 として提供されていた iOS ポートは ios/arm64 に名称変更されました。GOOS=ios は、GOOS=android が linux ビルドタグを暗黙的に意味するのと同様に、darwin ビルドタグを意味します。この変更は、gomobile を使用して iOS アプリをビルドしているユーザーにとっては透過的なものとなります。
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上の64ビットx86および64ビット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=387をGO386=softfloatに置き換える必要があります。
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.mod
ファイルが存在する場合でも無視します。これは、メインモジュールの依存関係に影響を与えずに実行可能ファイルをインストールするのに便利です。
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
環境変数のパターンに一致するリポジトリからのみコードをダウンロードするために使用できます。詳細はgohelpvcs
を参照してください。
allパターン
メインモジュールのgo.mod
ファイルがgo 1.16
以上を宣言している場合、all
パッケージパターンは、メインモジュール内のパッケージまたはテストによって推移的にインポートされるパッケージのみを一致させるようになりました。(メインモジュールによってインポートされたパッケージのテストによってインポートされたパッケージはもはや含まれません。)これは、Go 1.11以降go mod vendor
によって保持されるパッケージのセットと同じです。
-toolexecビルドフラグ
-toolexec
ビルドフラグが指定されて、compile
やasm
のようなツールチェーンプログラムを呼び出す際にプログラムを使用する場合、環境変数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
ゴルーチン内での無効な testing.T 使用に対する新しい警告
vet
ツールは、テスト中に作成されたゴルーチン内からtesting.T
メソッドFatal
を無効に呼び出すことについて警告するようになりました。これは、Fatalf
、FailNow
、およびSkip{,f,Now}
メソッドをtesting.T
テストまたはtesting.B
ベンチマークで呼び出す場合にも警告します。これらのメソッドの呼び出しは、作成されたゴルーチンの実行を停止し、Test*
またはBenchmark*
関数を停止しません。したがって、これらはテストまたはベンチマーク関数を実行しているゴルーチンによって呼び出される必要があります。例えば:
|
|
作成されたゴルーチンからt.Fatal
(または類似のメソッド)を呼び出すコードは、t.Error
を使用してテストの失敗を通知し、return
ステートメントなどの代替方法を使用してゴルーチンを早期に終了するように書き換える必要があります。前の例は次のように書き換えることができます:
|
|
フレームポインタに対する新しい警告
vet
ツールは、呼び出し規約に反してBPレジスタ(フレームポインタ)を保存および復元せずに破壊するamd64アセンブリについて警告するようになりました。BPレジスタを保持しないコードは、BPをまったく使用しないか、BPを保存および復元して保持するように変更する必要があります。BPを保持する簡単な方法は、フレームサイズをゼロ以外の値に設定することです。これにより、生成されたプロローグとエピローグがBPレジスタを自動的に保持します。例としてCL 248260
を参照してください。
asn1.Unmarshalに対する新しい警告
vet
ツールは、asn1.Unmarshal
に非ポインタまたはnil引数を誤って渡すことについて警告するようになりました。これは、encoding/json.Unmarshal
およびencoding/xml.Unmarshal
に対する既存のチェックと同様です。
ランタイム
新しいruntime/metrics パッケージは、Goランタイムから実装定義のメトリックを読み取るための安定したインターフェースを導入します。これは、既存のruntime.ReadMemStats やdebug.GCStats などの関数を置き換え、より一般的で効率的です。詳細はパッケージドキュメントを参照してください。
GODEBUG環境変数をinittrace=1
に設定すると、各パッケージの初期化に対して実行時間とメモリ割り当てを要約した1行を標準エラーに出力するようになりました。このトレースは、Goの起動パフォーマンスのボトルネックやリグレッションを見つけるのに使用できます。GODEBUGドキュメント
にフォーマットが記載されています。
Linuxでは、ランタイムはメモリをオペレーティングシステムに迅速に解放することをデフォルトとするようになりました(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ディレクティブ を使用して、コンパイル中にプログラムに埋め込まれたファイルにアクセスする機能を提供します。
ファイルシステム
新しいio/fs
パッケージは、ファイルの読み取り専用ツリーの抽象化であるfs.FS
インターフェースを定義します。標準ライブラリパッケージは、適切にインターフェースを利用するように適応されています。インターフェースのプロデューサー側では、新しいembed.FS
型がfs.FS
を実装しており、zip.Reader
も同様です。新しい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 (注:スライスの戻り値がos.DirEntry に変更され、fs.FileInfo ではなくなりました)
- 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接続でのI/O操作は、新しいnet.ErrClosed
エラーを使用して検出できるようになりました。典型的な使用法はerrors.Is(err, net.ErrClosed)
です。Conn.Close
で「close notify」アラートを送信する前にデフォルトの書き込み期限が設定され、無期限にブロックされるのを防ぎます。クライアントは、サーバーがクライアントによって広告されたリストにないALPNプロトコルを選択した場合、ハンドシェイクエラーを返すようになりました。サーバーは、クライアントまたはサーバーのいずれかがAESハードウェアサポートを持たない場合、AES-GCM暗号スイートよりも他の利用可能なAEAD暗号スイート(ChaCha20Poly1305など)を優先するようになりました。ただし、Config.PreferServerCipherSuites
とConfig.CipherSuites
の両方が設定されている場合を除きます。クライアントは、AES-GCM暗号スイートの優先順位を示さない場合、AESハードウェアサポートを持たないと見なされます。Config.Clone
は、レシーバーがnilの場合、パニックを起こすのではなくnilを返すようになりました。
crypto/x509
GODEBUG=x509ignoreCN=0
フラグはGo 1.17で削除されます。これは、X.509証明書のCommonNameフィールドを、Subject Alternative Namesが存在しない場合にホスト名として扱うレガシー動作を有効にします。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ファイルのリストがあります。
go/build/constraint
新しいgo/build/constraint
パッケージは、ビルド制約行を解析します。これは、元の// +build
構文と、Go 1.17で導入される//go:build
構文の両方を解析します。このパッケージは、Go 1.16でビルドされたツールがGo 1.17のソースコードを処理できるように存在します。ビルド制約構文と//go:build
構文への移行計画の詳細については、https://golang.org/design/draft-gobuild
を参照してください。//go:build
行はGo 1.16ではサポートされておらず、まだGoプログラムに導入されるべきではありません。
html/template
新しいtemplate.ParseFS
関数とtemplate.Template.ParseFS
メソッドは、template.ParseGlob
およびtemplate.Template.ParseGlob
と似ていますが、テンプレートをfs.FS
から読み取ります。
io
パッケージは現在、ReadSeekCloser
インターフェースを定義しています。パッケージは現在、Discard
、NopCloser
、およびReadAll
を定義しており、io/ioutil
パッケージの同じ名前のものの代わりに使用されます。
log
新しいDefault
関数は、デフォルトのLogger
へのアクセスを提供します。
log/syslog
Writer
は、カスタムUnixドメインソケットにログを記録する際に、ホスト名を省略し、短いタイムスタンプを使用するローカルメッセージ形式を使用するようになりました。これは、デフォルトのログソケットで既に使用されている形式と一致します。
mime/multipart
Reader
のReadForm
メソッドは、最大int64
値を制限として渡された場合にフォームデータを拒否しなくなりました。
net
閉じたネットワーク接続でのI/O、またはI/Oが完了する前に閉じられたネットワーク接続でのI/Oの場合、新しいErrClosed
エラーを使用して検出できるようになりました。典型的な使用法はerrors.Is(err, net.ErrClosed)
です。以前のリリースでは、このケースを確実に検出する唯一の方法は、Error
メソッドによって返される文字列を「use of closed network connection」と一致させることでした。以前のGoリリースでは、LinuxシステムでのデフォルトのTCPリスナーバックログサイズは、/proc/sys/net/core/somaxconn
によって65535に制限されていました。Linuxカーネルバージョン4.1以降では、最大値は4294967295です。Linuxでは、/etc/nsswitch.conf
が欠落している場合、ホスト名のルックアップはDNSを使用せずに/etc/hosts
を最初にチェックするようになりました。これは、musl
ベースのシステムで一般的であり、Goプログラムがこれらのシステム上のCプログラムの動作と一致するようにします。
net/http
net/http
パッケージでは、StripPrefix
の動作が変更され、リクエストURLのRawPath
フィールドからもプレフィックスを削除するようになりました。過去のリリースでは、Path
フィールドのみがトリムされていたため、リクエストURLにエスケープされた文字が含まれている場合、URLはPath
とRawPath
フィールドが一致しないように変更されていました。Go 1.16では、StripPrefix
は両方のフィールドをトリムします。リクエストURLのプレフィックス部分にエスケープされた文字が含まれている場合、ハンドラーは404を返し、以前の動作であるPath
/RawPath
ペアが一致しない状態で基礎となるハンドラーを呼び出すことはありません。net/http
パッケージは、"Range": "bytes=--N"
の形式のHTTPレンジリクエストを拒否するようになりました。ここで、"-N"
は負のサフィックス長です(例:"Range": "bytes=--2"
)。現在、416「Range Not Satisfiable」応答を返します。SameSiteDefaultMode
で設定されたクッキーは、現在の仕様に従って動作するようになりました(属性は設定されません)。Client
は、空のボディを持つPATCHリクエストで明示的なContent-Length: 0
ヘッダーを送信するようになり、既存のPOSTおよびPUTの動作と一致します。ProxyFromEnvironment
関数は、HTTPS_PROXY
が設定されていない場合、https://
URLに対してHTTP_PROXY
環境変数の設定を返さなくなりました。Transport
型には、新しいフィールドGetProxyConnectHeader
があり、CONNECTリクエスト中にプロキシに送信するヘッダーを返す関数を設定できます。実質的に、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
を返すようになりました。パッケージは、新しい型DirEntry
をfs.DirEntry
のエイリアスとして定義しています。新しいReadDir
関数と新しいFile.ReadDir
メソッドは、ディレクトリの内容をDirEntry
のスライスに読み取るために使用できます。File.Readdir
メソッド(ディレクトリの小文字のd
に注意)はまだ存在し、FileInfo
のスライスを返しますが、ほとんどのプログラムではFile.ReadDir
に切り替える方が効率的です。パッケージは現在、CreateTemp
、MkdirTemp
、ReadFile
、およびWriteFile
を定義しており、io/ioutil
パッケージで定義された関数の代わりに使用されます。型FileInfo
、FileMode
、およびPathError
は、io/fs
パッケージの同じ名前の型のエイリアスになりました。os
パッケージの関数シグネチャは、io/fs
パッケージの名前を参照するように更新されました。これは既存のコードには影響しないはずです。新しいDirFS
関数は、オペレーティングシステムファイルのツリーによってバックアップされたfs.FS
の実装を提供します。
os/signal
新しいNotifyContext
関数は、特定のシグナルの到着時にキャンセルされるコンテキストを作成することを可能にします。
path
Match
関数は、パターンの一致しない部分に構文エラーがある場合にエラーを返すようになりました。以前は、一致しない場合に早期に戻り、そのためパターンの後続の構文エラーを報告しませんでした。
path/filepath
新しい関数WalkDir
は、Walk
に似ていますが、通常はより効率的です。WalkDir
に渡される関数は、fs.DirEntry
を受け取ります。Walk
関数がos.FileInfo
を受け取ると記憶している人のために説明すると、os.FileInfo
は現在fs.FileInfo
のエイリアスです。Match
およびGlob
関数は、パターンの一致しない部分に構文エラーがある場合にエラーを返すようになりました。以前は、一致しない場合に早期に戻り、そのためパターンの後続の構文エラーを報告しませんでした。
reflect
Zero
関数は、割り当てを回避するように最適化されました。返されたValue
を別のValue
と==
またはDeepEqual
を使用して誤って比較するコードは、以前のGoバージョンで得られた結果と異なる結果を得る可能性があります。reflect.Value
のドキュメントは、2つのValue
を正しく比較する方法を説明しています。
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
がパースツリーに追加されました。パースツリーのMode
フィールドは、それにアクセスすることを可能にします。
time/tzdata
スリムなタイムゾーンデータ形式が、$GOROOT/lib/time/zoneinfo.zip
およびこのパッケージに埋め込まれたコピーのタイムゾーンデータベースに使用されるようになりました。これにより、タイムゾーンデータベースのサイズが約350 KB削減されます。
unicode
unicode
パッケージとシステム全体の関連サポートは、Unicode 12.0.0からUnicode 13.0.0
にアップグレードされました。これにより、4つの新しいスクリプトと55の新しい絵文字を含む5,930の新しい文字が追加されました。Unicode 13.0.0は、プレーン3(U+30000-U+3FFFF)を三次表意文字プレーンとして指定しています。