golang/go に行われたコミットから個人的に気になったものをリストにしたものです。
タイトルに 2021 年 9 月と銘打っていますが 8 月のコミットも含まれていますし 10 月を作る予定も今のところありません。
軽く説明を追加していますが勘違いや誤りがあるかもしれません。
Commits
2021-08-13
バージョンが Go 1.17 から Go 1.18 に変更されました。
2021-08-17
http.ResponseWriter で HTTP ヘッダーを設定する際に改行もそのまま出力されてしまう不具合が修正されています。 1
string と []byte の変換を減らすことでメモリ割り当てを減らす修正です。
UDP を読み書きする際のメモリ割り当てを減らす修正の一部です。 2
2021-08-20
このコミット自体は reflect.Type の ConvertibleTo メソッドに対するテスト追加です。
どうやら Go 1.8 から Go 1.16 までの間に存在したバグが Go 1.17 で意図せず修正されていたようです。 3
システムコールする API は引数の数ごとに用意されていましたが可変長引数を受け取る API が追加されたようです。 4
2021-08-21
ジェネリクスをデフォルトで有効化するための変更です。
2021-08-26
bytes や strings でシングルバイト 1 文字を trim する際のパフォーマンスが大幅に改善されています。 5
SSA でいくつかのパターンの整数値計算を最適化する変更です。
Linux x86_64 で Go のバイナリサイズが 0.05% 削減されたそうです。
2021-09-03
image パッケージで RGBA をより効率的に扱うための修正です。 6
2021-09-04
Go でビルドした wasm を使う際の JavaScript で strict モードを有効化する変更です。 7
2021-09-06
中国で設計された LoongArch アーキテクチャの GOARCH として loong64 が定義されました。 8
Go 1.17 で対応していないけど名前が予約されていたものですね。
2021-09-07
len() の結果比較を可能であれば 0 との比較に書き換える修正です。 9
2021-09-08
amd64/arm64 向けに prefetch 命令サポートが追加されています。
GC で利用しているようです。
2021-09-11
string を key とする map に reflect でアクセスする際の性能が改善されています。
ただし、 key のサイズが大きい場合に不具合があり別の commit で修正されています。 10
2021-09-12
bufio 内部で保持している []byte に外部からアクセスするための方法が追加されています。 11
少しトリッキーに見えますがうまく使えばメモリ割り当てを減らせそうです。
2021-09-14
単純な比較が可能な型限定ですが reflect.DeepEqual が高速化されました。
2021-09-17
コンパイラが GOAMD64 という環境変数で amd64 アーキテクチャの世代を参照するようになりました。 12
この指定でより新しい CPU 向けの最適化ができるようになるかもしれません。 13
2021-09-21
text/template がテンプレート内の and/or ですべての値を評価していたのが途中で止めるように修正されました。 14
ただし、いくつか不具合があってまだ修正されているようです。
Fuzz testing が導入されました。
次の記事で詳しく解説されていました。
2021-09-23
text/template が range ループ内での break/continue をサポートするようです。 15
2021-09-24
ジェネリクスで利用される型を定義した constraints パッケージが追加されました。 16
2021-09-28
reflect.Value に CanInt/CanUint/CanFloat/CanComplex が追加されました。 17
感想
ジェネリクス関連の修正が多いように感じました。
それ以外にも細かいところで使い勝手が改善されているようです。
あまり書いていないのですが各 CPU 向けの最適化も多数入っているようです。