1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-04-07

golang/go の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。
タイトルに 2022 年 3 月と銘打っていますが 2 月のコミットも含まれています。

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

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

Topic

  • Go 1.18 がリリースされました。 :rocket:
  • Go 1.19 の開発がスタートしました。 :rocket:

Commits

2022-02-10

Go 1.18 で追加される debug.BuildInfo が提供する関数が変更されました。

runtime 内で使用されている時間分布のヒストグラム処理でバケットの計算に誤りがあったようです。 1
この修正は Go 1.16.15 および Go 1.17.8 にもバックポートされています。

2022-02-11

スタックオーバーフローを避けるため、ネストされた正規表現に深さ制限 (1000) が追加されました。 2
この修正は Go 1.16.15 および Go 1.17.8 にもバックポートされています。

なお、その後の修正により Go 1.19 では新しいエラーが定義されています。 3

2022-02-16

DNS のレスポンスサイズが 512 byte を超えている場合に cannot unmarshal DNS というエラーが出ていたのをバッファサイズを 1232 byte に増やすことで回避しています。 4
RFC 的には 512 byte に制限していても問題ないですが実環境で多数の問題が発生しているためサイズを大きくしたようです。 5 6 7 8
この修正は Go 1.16.15 および Go 1.17.8 にもバックポートされています。

当初は EDNS(0) をデフォルトで有効化するような形で実装されましたが互換性を考慮して単にバッファサイズ変更のみ行うように再修正、 EDNS(0) のデフォルト有効化は Go 1.19 向けにリスケジュールしています。 9

2022-02-25

Linux カーネルの要求バージョンが 2.6.32 以上になりました。 10
これにより古いカーネルをサポートするための処理が削除できるようになりました。 11 12

2022-03-01

バージョンが Go 1.18 から Go 1.19 に変更されました。 :rocket:

なお、この時点では Go 1.18 の開発が継続中だったうえに Go 1.18 のリリースブランチは Go 1.18 rc.1 時点のものでした。
このためバージョンを Go 1.19 に変更する直前までの変更を Go 1.18 のリリースブランチに取り込んだ 13 のち、それ以降に行われた変更は master ブランチに行われた変更から Go 1.18 にも必要なものを個別に取り込む形になっています。 14 15

2022-03-02

ジェネリクス非対応の旧コードが削除され -G オプションが廃止されました。

map リテラルで map を作成する際の初期キャパシティが小さく、項目数が 9 以上の場合にキャパシティ拡張が発生する問題が修正されました。 16
今後は宣言された項目を格納するのに十分なキャパシティが最初から確保されるようになります。

Go のトークン解析パフォーマンスが少し向上するようです。

utf8.Valid() のパフォーマンスが向上しています。
スライス容量の再計算を省くための最適化をしているとのことです。

2022-03-03

encoding/binary に固定長の整数値を byte スライスに追加する関数が追加されました。 17
Issue にも書かれていますがバイナリデータを出力する操作が簡単になりそうです。

ジェネリクス対応を想定して sort パッケージのコード生成処理が変更されています。 16

2022-03-04

Go 1.18 で追加された go.work ですが go work init . で初期化すると . ではなく ./. が設定される不具合が修正されています。 18

2022-03-08

io.MultiReader でゼロコピーを実現するための修正が行われています。 19

2022-03-09

crypto/randPrime() が簡素化されました。
incremental search を廃止して rejection sampling のみにしたとのことです。
タイミングリークしにくくなるなどのメリットがあるようです。

2022-03-10

net/url にパス操作用の関数として JoinPath() が追加されました。 20

2022-03-11

bytes.Buffer の内部バッファを拡張する際のサイズが変更されました。 21
具体的には 2*cap+n だったのが len+n2*cap の大きい方に変更されており、メモリ消費を削減しつつ大幅に高速化しています。

2022-03-12

encoding/hex をテーブルベースの実装に変更することで大幅に高速化しています。
変換テーブルが追加されているにもかかわらず関数の簡略化や削除によって amd64 だとバイナリサイズも小さくなるようです。

2022-03-13

os.File.ReadAt() に対するレースコンディションを検出できない不具合が修正されています。
このコミットだけでは修正が不十分だったため追加のコミットも行われています。 22 23 24

2022-03-14

net/url の URL にホスト名が設定されていないことを示す URL.OmitHost フィールドが追加されました。 25
スキーマ名とパスのみの URL を処理する際に便利そうです。

2022-03-15

次のバージョン向けに新規追加された API は api/next.txt に記録されていたのが廃止され、 api/next/#nnnnn.txt というファイル (#nnnnn は GitHub Issue 番号) で記録するようになりました。
リリース時に連結されて go1.XX.txt というファイルに保存されます。

text/template などで Go 1.18 から利用可能になった continue と break について、前後に空白があるとエラーになる不具合が修正されました。 26
Issue には CherryPickCandidate ラベルが設定されていますが現時点で Go 1.18 へのバックポートはされていません。

2022-03-17

Go には map の全エントリーを削除するような for ループを検出して mapclear と呼ばれる専用処理に置き換える最適化処理がありますが、ジェネリクス使用時は最適化されない問題が修正されました。 27

2022-03-26

net/http/httptest で発生するレースコンディションが修正されました。 28
Go 1.18 向けにバックポート予定みたいですがまだされていません。

select が含まれる関数もインライン化できるようになりました。

2022-03-28

time.Duration に絶対値を返す Duration.Abs() が追加されました。 29
2 つの time.Time の差が一定時間内ならとかの処理を書きやすくなります。

これより先に 2 つの time.Time の大小比較を行う Time.Compare() が提案されており受け入れられているのですがこちらはまだ実装されていないようです。 30

2022-03-29

Go 1.16 で非推奨になった io/ioutilDeprecated: コメントが追加されました。 31 32
これによってドキュメントに非推奨マーカーが表示され Linter での検出も容易になるそうです。

bytes.Trim() および bytes.TrimLeft() に空スライスを渡した場合は空スライスではなく nil を返すように修正されました。 33
これは Go 1.17 以前の動作に合わせたものです。

Go 1.18 にもバックポートされていますがまだリリースはされていません。 34

unix ビルドタグ指定時は UNIX ライクな GOOS とマッチするようになりました。 35
当初は _unix.go というファイル名も対象にしようとしていたようですがビルドが広範囲で壊れたためファイル名による判定は見送りとなりました。

雑感

新しいリリースサイクルがスタートしたため多数の変更が行われています。
とはいえ Go 1.18 リリース前に Go 1.19 開発が始まったのはちょっと驚きでした。

またジェネリクス関連の修正も多数行われています。

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

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

  3. https://github.com/golang/go/commit/1af60b2f4990bffdd1b050ffd11e978578d1e38f

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

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

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

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

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

  9. https://github.com/golang/go/commit/301fd8ac8b6cd93708ad536eb054e1b081982a9b

  10. https://github.com/golang/go/issues/45964

  11. https://github.com/golang/go/commit/6c6a8fb702fcf3c2d23dc68976a831b2bdcad03e

  12. https://github.com/golang/go/commit/9d34fc5108d91bfcce3c465069dbb2c563af4229

  13. https://go-review.googlesource.com/c/go/+/389554/

  14. https://github.com/golang/go/issues/51336

  15. https://github.com/golang/go/issues/51460

  16. https://github.com/golang/go/issues/43020 2

  17. https://github.com/golang/go/issues/50601

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

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

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

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

  22. https://github.com/golang/go/commit/e475cf2e705d4eda8647426e060898ab3f643610

  23. https://github.com/golang/sys/commit/27bbf83dae8796c63b8dd88064c11bea9a730daa

  24. https://github.com/golang/sys/commit/039c03cc5b867cd7b06a19ff375be5c945c80b10

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

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

  27. https://github.com/golang/go/issues/51699

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

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

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

  31. https://go.dev/doc/go1.16#ioutil

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

  33. https://github.com/golang/go/issues/51793

  34. https://github.com/golang/go/commit/8b0583a05441b84a99d03daa78a24306c85cddd3

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

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