Go の気になったコミット (2021 年 9 月)

[golang/go](https://github.com/golang/go) に行われたコミットから個人的に気になったものをリストにしたものです。
タイトルに 2021 年 9 月と銘打っていますが 8 月のコミットも含まれていますし 10 月を作る予定も今のところありません。

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

## Commits

### 2021-08-13

https://github.com/golang/go/commit/46fd547d899286982971474b329d7a95da4f2a6b

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

### 2021-08-17

https://github.com/golang/go/commit/ec271687129dc8b263699b0b9d3abed71d8bd39d

http.ResponseWriter で HTTP ヘッダーを設定する際に改行もそのまま出力されてしまう不具合が修正されています。 [^1]

https://github.com/golang/go/commit/c04a32e59a001f0490082619bbe6a36e1e23ef99

string と []byte の変換を減らすことでメモリ割り当てを減らす修正です。

https://github.com/golang/go/commit/d9349175ad13ab228d3224c4bff8e3e1b2936b42

https://github.com/golang/go/commit/9c5eb16f6cba2b3d75f440dfec157183cc6d0f35

https://github.com/golang/go/commit/2a193337164c8af8cba3d5c4ec0f36413c528bd8

UDP を読み書きする際のメモリ割り当てを減らす修正の一部です。 [^2]

### 2021-08-20

https://github.com/golang/go/commit/9871726c72af7009aa73be33edfa06a8d9e5965e

このコミット自体は reflect.Type の ConvertibleTo メソッドに対するテスト追加です。
どうやら Go 1.8 から Go 1.16 までの間に存在したバグが Go 1.17 で意図せず修正されていたようです。 [^3]

https://github.com/golang/go/commit/0e598e7da42aea47b6b9d52c4292f202368d2f19

システムコールする API は引数の数ごとに用意されていましたが可変長引数を受け取る API が追加されたようです。 [^4]

### 2021-08-21

https://github.com/golang/go/commit/c9912780ab3ecea3c685bfc8bec229c0d2b09317

ジェネリクスをデフォルトで有効化するための変更です。 :tada:

### 2021-08-26

https://github.com/golang/go/commit/5baf60d47245c792c50a349cd6b8586d23204895

bytes や strings でシングルバイト 1 文字を trim する際のパフォーマンスが大幅に改善されています。 [^5]

https://github.com/golang/go/commit/6cf1d5d0fa1049e2910d048ce2b6b5a97fe6edc4

SSA でいくつかのパターンの整数値計算を最適化する変更です。
Linux x86_64 で Go のバイナリサイズが 0.05% 削減されたそうです。

### 2021-09-03

https://github.com/golang/go/commit/9f69a44308f4f9cbdae68925202dfef2027a7d20

image パッケージで RGBA をより効率的に扱うための修正です。 [^6]

### 2021-09-04

https://github.com/golang/go/commit/04d8d249600bf7b350454175c521e0c251785956

Go でビルドした wasm を使う際の JavaScript で strict モードを有効化する変更です。 [^7]

### 2021-09-06

https://github.com/golang/go/commit/c7f09eeb1397e177508c8761c469dd377ce390cf

中国で設計された LoongArch アーキテクチャの GOARCH として loong64 が定義されました。 [^8]
Go 1.17 で対応していないけど名前が予約されていたものですね。

### 2021-09-07

https://github.com/golang/go/commit/21de6bc463e52af01bcbfda478e2cb221e982e41

len() の結果比較を可能であれば 0 との比較に書き換える修正です。 [^9]

### 2021-09-08

https://github.com/golang/go/commit/23f4f0db682fad0c8d61a5b5cdbdbad4cf1cd41f

amd64/arm64 向けに prefetch 命令サポートが追加されています。
GC で利用しているようです。

### 2021-09-11

https://github.com/golang/go/commit/23832ba2e2fb396cda1dacf3e8afcb38ec36dcba

string を key とする map に reflect でアクセスする際の性能が改善されています。
ただし、 key のサイズが大きい場合に不具合があり別の commit で修正されています。 [^10]

### 2021-09-12

https://github.com/golang/go/commit/0d8a4bfc962a606584be0a76ed708f86b44164c7

bufio 内部で保持している []byte に外部からアクセスするための方法が追加されています。 [^11]
少しトリッキーに見えますがうまく使えばメモリ割り当てを減らせそうです。

### 2021-09-14

https://github.com/golang/go/commit/a0c409cbc82ea9999a03fa0bfe6d9a8953e780e0

単純な比較が可能な型限定ですが reflect.DeepEqual が高速化されました。

### 2021-09-17

https://github.com/golang/go/commit/b1bedc0774d8a3a7ff8778e933ee92e8638e9493

コンパイラが GOAMD64 という環境変数で amd64 アーキテクチャの世代を参照するようになりました。 [^12]
この指定でより新しい CPU 向けの最適化ができるようになるかもしれません。 [^13]

### 2021-09-21

https://github.com/golang/go/commit/7d67f8d4354d864fcbe6b218b7f80bcdfde851c9

text/template がテンプレート内の and/or ですべての値を評価していたのが途中で止めるように修正されました。 [^14]
ただし、いくつか不具合があってまだ修正されているようです。

https://github.com/golang/go/commit/6e81f78c0f1653ea140e6c8d008700ddad1fa0a5

Fuzz testing が導入されました。 :tada:
次の記事で詳しく解説されていました。

https://mattn.kaoriya.net/software/lang/go/20210921104445.htm

### 2021-09-23

https://github.com/golang/go/commit/d0dd26a88c019d54f22463daae81e785f5867565

text/template が range ループ内での break/continue をサポートするようです。 [^15]

### 2021-09-24

https://github.com/golang/go/commit/4dd5f0994f2e2079582876db4af1cba95fe3b6c2

ジェネリクスで利用される型を定義した constraints パッケージが追加されました。 [^16]

### 2021-09-28

https://github.com/golang/go/commit/04f7521b0aef10d523d6de006e723afd349b4b95

reflect.Value に CanInt/CanUint/CanFloat/CanComplex が追加されました。 [^17]

## 感想

ジェネリクス関連の修正が多いように感じました。
それ以外にも細かいところで使い勝手が改善されているようです。

あまり書いていないのですが各 CPU 向けの最適化も多数入っているようです。

[^1]: https://github.com/golang/go/issues/47711
[^2]: https://github.com/golang/go/issues/43451
[^3]: https://github.com/golang/go/issues/47785
[^4]: https://github.com/golang/go/issues/46552
[^5]: https://github.com/golang/go/issues/46446
[^6]: https://github.com/golang/go/issues/44808
[^7]: https://github.com/golang/go/issues/47116
[^8]: https://github.com/golang/go/issues/46229
[^9]: https://github.com/golang/go/issues/48054
[^10]: https://github.com/golang/go/commit/ac40c9872f6e8ef095dcc6ee556236782eee4f76
[^11]: https://github.com/golang/go/issues/47527
[^12]: https://github.com/golang/go/issues/45453
[^13]: https://github.com/golang/go/issues/25489
[^14]: https://github.com/golang/go/issues/31103
[^15]: https://github.com/golang/go/issues/20531
[^16]: https://github.com/golang/go/issues/45458
[^17]: https://github.com/golang/go/issues/47658