LoginSignup
1
0

More than 1 year has passed since last update.

Go の気になったコミット (2022 年 4 月)

Last updated at Posted at 2022-05-16

golang/go の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

Topic

Commits

2022-04-01

楕円曲線暗号で使用する P-256 の処理で panic を起こす問題が修正されています。 1 2
この修正はバックポートされており Go 1.17.9 および Go 1.18.1 がリリース済みです。

Go では OS やアーキテクチャに固有の処理がある場合はファイル名を使用して GOOS や GOARCH を指定することが一般的です。
ソースディレクトリで使用されているタグは build.PackageAllTags で調べられますが GOOS と GOARCH が両方指定されており実行環境と GOARCH が一致する場合に GOOS が含まれない問題が修正されています。 3

連続したメモリをゼロクリアするためのランタイム関数 memclrNoHeapPointers() が AVX2 が利用できる場合 (GOAMD64 が 3 以上の場合) に最適化されています。

Go 1.18 で新しい GC Pacer が導入されたため古いコードが削除されています。

ユニコードの U+007Fstrconv.Quote() に渡した際に制御文字 (DELETE) としてエスケープされていなかった問題が修正されています。 4

Go 1.18 で導入された go work use にディレクトリではなくファイル名を渡すと panic になる問題が修正されています。 5

HTTP レスポンスがステータス 301 かつ Location ヘッダーがない場合にレスポンスの内容を取得できない問題が修正されています。 6
一般的にステータス 301 は Location ヘッダーとセットのことが多い (RFC 7231 では SHOULD) ですが Location ヘッダーを設定しないサーバー (Amazon S3) が存在するため対応したようです。

arm64 向けに命令のサポートが追加されています。
gVisor に必要だからというのがその理由みたいです。

2022-04-02

Go doc のフォーマット変更に向けた作業の一部です。 7
Go 1.19 では gofmt がドキュメントコメントもサポートするほか、構文を解析するパッケージが追加されます。

Go 1.13 未満の環境で型指定されていないシフト演算を警告する不具合が修正されています。 8
Go 1.18 でビルドされた gopls を使用して Go 1.11 のコードを修正するようなケースで遭遇する問題です。

2022-04-04

net でキャンセルまたはタイムアウトが発生した際のエラーを errors.Is(err, context.Canceled) または errors.Is(err, context.DeadlineExceeded) で判定できるようになりました。従来からある net.Error との互換性も問題ありません。 9

Windows でも os.Interrupt をハンドリングするための修正が行われています。
残念ながらこの修正は後日 revert されてしまいました。 10

Go 1.18 で導入された go work use -r に存在しないディレクトリ名を渡すと panic になる問題が修正されています。 11

ネストされた正規表現が深さ制限 (1000) を超えた際のエラーとして ErrInvalidDepth が新しく定義されました。 12
深さ制限チェックの追加は Go 1.18 リリース前に行われており Go 1.16, Go 1.17 にもバックポートされています。 13
ただし、この時点では既存のエラーを使う形になっていました。

なお ErrInvalidDepth は別のコミットによって ErrNestingDepth にリネームされています。 14 15
元の提案では ErrNestingDepth だったのが何故か ErrInvalidDepth で反映されていたらしいです。

2022-04-05

Go 1.18 から SHA-1 形式で署名された証明書の検証が無効化されました。 16
しかし、 OCSP 応答または CRL についても無効化され WebPKI との互換性に問題が出たため証明書のみを対象とするように修正されました。 17
この修正は Go 1.18.1 にもバックポートされています。

reflect.Type.NumMethod() および reflect.Value.NumMethod() のコメントが修正されています。
interface に対して使った場合にドキュメントと実際の動作が異なる問題がありましたが、ドキュメントを修正する対応がとられています。
本来は不具合として Go 1.16 で修正予定でしたが互換性問題があったため取りやめとなった経緯があるようです。

text/template で comparable ではない値 (マップやスライス) と nil の比較が可能になりました。 18

同じサイズの配列 (スライスではない) を比較する際のコード生成に対してアンロールによる最適化が行われています。

2022-04-06

証明書の検証処理が修正されています。 19 20

hash/maphash のオーバーヘッドが大きいため文字列やバイト列から直接ハッシュ値を取得する関数が追加されています。 21

2022-04-07

NetBSD 環境でのテストで特定のエラーを無視する修正が行われています。 22
Go 本体のテストなので実装への影響はありません。

riscv64 でレジスタベースの関数呼び出し規約が有効化されました。
amd64, arm64, ppc64 に続くアーキテクチャになります。
(デフォルト有効化はこのコミットではなく別コミットで行われていました)

sort パッケージにバイナリサーチ用の関数として Find() が追加されました。 23
すでに sort.Search() が存在するのですが比較関数の型が変更されたほか、一致する項目があったかどうかも返すようになっています。

2022-04-12

doc/comment パッケージが追加されています。 24
記載は省略していますが多数の変更が行われています。

クローズされたチャンネルに対する受信処理の性能が改善されています。 25

2022-04-13

エラーを含む大きな PEM ファイルを与えられた場合に発生するスタックオーバーフローが修正されています。 26 27
この修正はバックポートされており Go 1.17.9 および Go 1.18.1 がリリース済みです。

Go 1.16 で追加された embed で埋め込もうとしているディレクトリがルートにあると動かない不具合が修正されています。 28
Dockerfile でビルドしようとした場合に遭遇しやすいようです。

Go 1.18 で追加された buildvcs オプションに auto が追加され、デフォルトも auto に変更されました。
従来のデフォルト有効 (true) でしたが VCS のディレクトリが存在するもののツールが利用できない場合にビルド失敗する問題が起きていたようです。 29

2022-04-14

sort パッケージのソート処理が quicksort から pdqsort (Pattern-defeating quicksort) ベースの実装に変更されています。 30
多くのケース (特にソート済みスライス) で従来より高速化されるようです。

2022-04-15

switch をバイナリサーチではなくジャンプテーブルで実装するための修正です。
常にジャンプテーブルが使われるわけではなく、利用可能なアーキテクチャにも制限があるようです。

定数などコンパイル時に決まる switch case の処理が改善されています。 31
runtime.GOOS などが多いようです。

byte スライスに Varint エンコードされた値を append する関数が追加されています。 32
Varint エンコードは protobuf で使われている形式で protobuf にも同様の (しかし少し最適化された) 関数が実装されているようです。 33

2022-04-16

http.Request.WithContext() で行われていた不要なデータコピーが削除されています。 34

http.StatusText() の実装が map から switch case に変更されています。
これによりコンパイル時の最適化が期待できるそうです。

macOS 環境でまれにデッドロックする問題が修正されています。 35
goroutine のプリエンプションとシグナル処理の組み合わせに問題があったらしく Go 1.17 および Go 1.18 にもバックポートされています。

2022-04-17

reflect.Value.Type() がインライン化できるようになりました。
常にインライン化の恩恵を受けられるわけではないようですが地味に効果がありそうです。

2022-04-20

crypto/rand で行っている乱数生成器からの読み込み処理がプラットフォームごとにバラバラだったのを統一したうえでバッファリングしないように修正されています。
従来は bufio で 4096 BYTE バッファしていたのがその都度取得するようになり、より新鮮な値を取得できるようになっただけでなく複数コアで取得する場合の性能向上が期待できるようです。

2022-04-21

runtime にランダムな uint64 を取得する fastrand64() が追加されています。
通常のプログラムからは利用できませんが標準ライブラリの一部から利用しているようです。 36 37 38

2022-04-22

POSIX プラットフォームにて exec.Cmd の Dir が空ではなく Env が nil の場合、子プロセスに Dir が環境変数 PWD として渡されるようになりました。 39
また、 exec.Cmd.Environ() が追加されておりコマンドに渡される環境変数を取得できるようになりました。

bufio.Writer.WriteString() でバッファサイズを超えた文字列を書き込む場合に writer が WriteString() をサポートしていればバッファを介さず書き込むことで不要なコピーを削減しています。
[]byte を書き込む Write() は以前からそのようになっていたようです。

構造体および配列の比較コードを生成する処理がリファクタリングされています。 40

reflect.Value にあるいくつかのメソッドがインライン化できるようになりました。
map や配列の長さ取得では若干の速度低下があるようですがそれ以外のケースでは高速化されており encoding/json にも影響が出ているようです。

2022-04-26

http.MaxBytesReader が返すエラーとして http.MaxBytesError が定義されました。 41
これによりエラーの理由をチェックできるようになります。

2022-04-27

定期的に (現在は 2 分に 1 回) に起動される GC で使われている idle mark worker の数が最大 1 個 (GC worker が既にある場合は 0 個) に制限されました。 42 43
これによって GC がほとんど起動していない Go プログラムの CPU 使用率が急激に上昇するといった問題が回避できるようです。

GC の goroutine をどのスレッドで動かすかの判定処理 (スケジューリング) が改善されています。 44 45
以前は停止したスレッドに割り当ててしまうことによる問題があったようです。

2022-04-29

Go ランタイムで発生する例外についてユーザーコードが原因と思われるものとそれ以外を分けたようです。 46
これによって問題の切り分けがしやすくなることを期待しているようです。

2022-04-30

Go 1.18 にて map の key に string をベースとした Defined type を使用している場合、 reflect.Value.SetMapIndex() および reflect.Value.MapIndex() が通常の string でも成功する問題が修正されています。 47
この問題は Go 1.18 からの不具合でバックポートが用意されています。

雑感

Go 1.18 リリースが遅れたせいか 4 月はコミットが多かったです。
4 月時点では完了していないので記載していませんが Go 1.19 には次の変更も入りそうです。

  • 新しいアーキテクチャ linux/loong64 が利用可能になりそうです。 48
  • BoringCrypto を使うための dev.boringcrypto ブランチを master にマージしようとしているようです。 49

また、 Go 開発者の方が Go 1.19 で追加される機能についてツイートしていましたのでご紹介します。
コミットを追いかけていたつもりですが見落としているものも多数ありました。

  1. https://github.com/golang/go/issues/52075

  2. https://github.com/advisories/GHSA-v5qw-m6mv-3q79

  3. https://github.com/golang/go/issues/52053

  4. https://github.com/golang/go/issues/52062

  5. https://github.com/golang/go/issues/51749

  6. https://github.com/golang/go/issues/49281

  7. https://github.com/golang/go/issues/51082

  8. https://github.com/golang/go/issues/52031

  9. https://github.com/golang/go/issues/51428

  10. https://github.com/golang/go/commit/f86f9a3038eb6db513a0ea36bc2af7a13b005e99

  11. https://github.com/golang/go/issues/51841

  12. https://github.com/golang/go/issues/51684

  13. https://github.com/golang/go/issues/51112

  14. https://github.com/golang/go/commit/575fd8817ae9817303a69065def80c574718169e

  15. https://github.com/golang/go/commit/0bf545e51f5303ddedb0ea60f02ff221ac088fc7

  16. https://tip.golang.org/doc/go1.18#sha1

  17. https://github.com/golang/go/issues/41682#issuecomment-1072695832

  18. https://github.com/golang/go/issues/51642

  19. https://github.com/golang/go/issues/48869

  20. https://github.com/golang/go/issues/45856

  21. https://github.com/golang/go/issues/42710

  22. https://github.com/golang/go/issues/52168

  23. https://github.com/golang/go/issues/50340

  24. https://github.com/golang/go/issues/51082

  25. https://github.com/golang/go/issues/52067

  26. https://github.com/golang/go/issues/51853

  27. https://github.com/advisories/GHSA-q42m-q8hq-53rj

  28. https://github.com/golang/go/issues/49570

  29. https://github.com/golang/go/issues/51748

  30. https://github.com/golang/go/issues/50154

  31. https://github.com/golang/go/issues/50253

  32. https://github.com/golang/go/issues/51644

  33. https://pkg.go.dev/google.golang.org/protobuf/encoding/protowire

  34. https://github.com/golang/go/issues/52239

  35. https://github.com/golang/go/issues/52226

  36. https://github.com/golang/go/commit/c2d436dcfad64d5cc301cf05d446f7a93c19133e

  37. https://github.com/golang/go/commit/01b8f5e8821eac0e3456d6200b351629fd3752f4

  38. https://github.com/golang/go/commit/a4bbcd4b1fc9dd40e0f86416d37bdd9e6d430f3f

  39. https://github.com/golang/go/issues/50599

  40. https://github.com/golang/go/issues/38674

  41. https://github.com/golang/go/issues/30715

  42. https://github.com/golang/go/issues/44163

  43. https://github.com/golang/go/issues/37116

  44. https://github.com/golang/go/issues/39004

  45. https://github.com/golang/go/issues/44313

  46. https://github.com/golang/go/issues/51485

  47. https://github.com/golang/go/issues/52379

  48. https://github.com/golang/go/issues/46229

  49. https://github.com/golang/go/issues/51940

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0