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

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

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

https://qiita.com/sg0hsmt/items/c2c77653b3f5361b1aa1

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

## Topic

- 既存の標準パッケージよりも改善された IP アドレス表現を提供する net/netip が追加されました。
- 新しい GC Pacer (GC をいつ動かすか決定するアルゴリズム) が実装され、デフォルトで有効になりました。
- 安全ではないとされている証明書の署名や TLS バージョンに対する扱いが変更されています。

## Commits

### 2021-11-02

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

既存の標準パッケージよりも改善された (小さく比較可能でメモリ割り当てが発生しない) IP アドレス表現を提供する net/netip が追加されました。 [^1] [^2]
既存とは異なる関数への移行が必要ですが特に UDP の送受信で恩恵が大きいようです。
記載していませんが UDP 送受信周りを最適化する変更もいくつかマージされています。

[^1]: https://github.com/golang/go/issues/46518
[^2]: https://tailscale.com/blog/netaddr-new-ip-type-for-go/

### 2021-11-03

https://github.com/golang/go/commit/8c8baad927b2fd0bca589bacab658fe0f7eb5dac

ビルドされたバイナリが必要とするアーキテクチャレベルを起動時にチェックするようになりました。 [^3]
Go 1.18 では同じ amd64 アーキテクチャでもより新しい世代で追加された命令を利用するようになりました [^4] が、起動時にチェックしないと未サポートの命令を実行したタイミングで SIGILL が発生するので地味に助かる処理だと思います。

[^3]: https://github.com/golang/go/issues/48506
[^4]: https://github.com/golang/go/issues/45453

### 2021-11-05

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

https://github.com/golang/go/commit/961aab26bffece299f1528b44d260ea0a921ac56

新しい GC Pacer (GC をいつ動かすか決定するアルゴリズム) が実装され、デフォルトで有効になりました。 [^5]
これにより最小ヒープサイズが 4 MiB から 512 KiB に削減されているのですが性能上の問題が見つかっておりヒープサイズは元に戻されています。 [^6] [^7]

[^5]: https://github.com/golang/go/issues/44167
[^6]: https://github.com/golang/go/issues/49744
[^7]: https://github.com/golang/go/commit/c5c1955077cb94736b0f311b3a02419d166f45ac

### 2021-11-06

https://github.com/golang/go/commit/37951d888152c6f3a2e4c11c609bfb0fbad6b15d

netip.Addr が提供する関数のメモリ割り当てが改善されています。
この PR をきっかけに知ったのですが名前付き戻り値を使うことでメモリコピーを減らせるようです。 [^8]
とはいえ最適化目的での利用は推奨されていません [^9] し、コンパイラに最適化を頑張ってほしいところです。

[^8]: https://github.com/golang/go/issues/20859
[^9]: https://github.com/golang/go/wiki/CodeReviewComments#named-result-parameters

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

SHA-1 形式で署名された証明書の検証が無効化されました。 [^10]

[^10]: https://github.com/golang/go/issues/41682

https://github.com/golang/go/commit/035963c7f5d82b5bf1501f407919031f815bd038

TLS クライアントが要求するデフォルトの最小バージョンが TLS 1.2 になりました。 [^11]
段階的に適用範囲を拡大していき、将来的に TLS 1.0 と TLS 1.1 のサポートを削除する予定みたいです。

[^11]: https://github.com/golang/go/issues/45428

### 2021-11-09

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

少し前の変更で Windows 環境でクラッシュダンプが作成できるようになった [^12] のですが、条件次第で Microsoft にクラッシュダンプ (メモリの内容を含む) が自動アップロードされる [^13] ため revert されました。

[^12]: https://github.com/golang/go/issues/20498
[^13]: https://github.com/golang/go/issues/49471

### 2021-11-13

https://github.com/golang/go/commit/76fbd6167364fb98e3ebe946cfc16b5b84d4240e

HTTP/2 にてレスポンスボディを Close()した場合にエラーが返ってくることがある不具合が修正されています。 [^14]
Go 1.17.3 のリグレッションとのことです。

[^14]: https://github.com/golang/go/issues/49366

### 2021-11-17

https://github.com/golang/go/commit/3d7cb23e3d5e7880d582f1b0300064bd1138f3ee

https://github.com/golang/go/commit/1d004fa2015d128acf6302fc74b95f6a36c35680

any (Go 1.18 で追加された事前定義された識別子) を使ったソースを go run ではなく go build すると失敗する問題の修正です。 [^15]
ジェネリクスが有効な場合は runtime のコンパイル時に事前定義された識別子として any が出力されるようになりました。

[^15]: https://github.com/golang/go/issues/49619

### 2021-11-20

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

事前定義された識別子である any を interface{} のエイリアスとして処理する修正です。 [^16]
これは Go の仕様にも記載されている [^17] そうですが、実際には Alias ではなく Defined type として処理されていたそうです。

> For convenience, the predeclared type any is an alias for the empty interface.

[^16]: https://github.com/golang/go/issues/49665
[^17]: https://tip.golang.org/ref/spec#Interface_types

## 雑感

リストに記載していないのですが相変わらずジェネリクス関連の修正が多いです。
また、 Go 1.18 リリースに向けてドキュメント周りの修正も多数行われていました。

ジェネリクスに限らず Go 1.18 では新しく追加された便利なパッケージや関数が多いため古い Go では動かないパッケージが増えそうだなと感じています。