Goの標準ライブラリに学ぶジェネリクス
by
tychy
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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が標準パッケージに取り込まれた ジェネリクスを活用し始める良いタイミング!