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