Slide 1

Slide 1 text

1 Goの標準ライブラリに学ぶジェネリクス Ryu Yamada Mercari.go #22 June 15, 2023

Slide 2

Slide 2 text

2 自己紹介 ● Ryu Yamada ○ https://github.com/tychy ○ https://twitter.com/tychy16 ● 2022年 4 月入社 ○ Partner Platform Team ● Backend Engineer

Slide 3

Slide 3 text

3 ジェネリクス使ってますか? Agenda timeパッケージでの利用例 slices/mapsパッケージでの利用例 標準ライブラリにジェネリクスを導入する難しさ 02 03 04 01

Slide 4

Slide 4 text

4 ジェネリクス使ってますか? Go1.18でリリースされた待望の機能 実際使ってますか? ● 使い所が難しい... ● 今のところユースケースがない... ● 気はなってはいる... 🤔 標準ライブラリでの使い方を見てみよう 💡

Slide 5

Slide 5 text

5 timeパッケージでの利用例 ● atoiをジェネリクスを使って実装 ● []byteとstringの変換がいらない 日付と時刻の操作を行うパッケージ

Slide 6

Slide 6 text

6 timeパッケージでのご利益 ● パフォーマンスの向上 ● 可読性と簡潔性の向上 ● atoiをジェネリクスを使って実装 ● []byteとstringの変換がいらない https://github.com/golang/go/commit/72c58f b77192f7d17d87663c943360a48aae11dc MarshalJSONを高速化

Slide 7

Slide 7 text

7 出来ないこと

Slide 8

Slide 8 text

8 メソッドではジェネリクスは利用できない メソッドでジェネリクスは利用できない これはダメ

Slide 9

Slide 9 text

9 関数として定義するしかない 👍 ジェネリクスを使いたいなら 関数に切り出す必要がある

Slide 10

Slide 10 text

10 slices/mapsパッケージ ● Go1.21で追加予定 ● sliceやmapに対する操作を提供

Slide 11

Slide 11 text

11 標準ライブラリ特有の難しさ math.Abs/Min/Maxやlist.List等にもジェネリクス入れない の? 使いどころはわかってきた 💡 🤔 list.Listを例に考えてみる

Slide 12

Slide 12 text

12 標準ライブラリ特有の難しさ list.Listはinterface{}型を利用して実装されている

Slide 13

Slide 13 text

13 標準ライブラリ特有の難しさ ジェネリクスを使って実装し直すと後方互換性が失われる 型が違うのでコンパイルできない

Slide 14

Slide 14 text

14 考えられる解決策 特に標準パッケージではジェネリクスへの移行は容易ではない 解決策も議論されている ● ジェネリクスを使って実装されたV2パッケージを用意 ● ジェネリクス用の関数を分けて定義する

Slide 15

Slide 15 text

15 ジェネリクスの現在地とこれから 標準ライブラリではジェネリクスの利用が始まっている ● 今回紹介した例以外にもatomic.Pointer型で利用されている ● slices/mapsが標準パッケージに取り込まれた ジェネリクスを活用し始める良いタイミング!