https://gihyo.jp/article/2023/05/tukinami-go-07?summary
1Goの標準ライブラリに学ぶジェネリクスRyu YamadaMercari.go #22June 15, 2023
View Slide
2自己紹介● Ryu Yamada○ https://github.com/tychy○ https://twitter.com/tychy16● 2022年 4 月入社○ Partner Platform Team● Backend Engineer
3ジェネリクス使ってますか?Agendatimeパッケージでの利用例slices/mapsパッケージでの利用例標準ライブラリにジェネリクスを導入する難しさ02030401
4ジェネリクス使ってますか?Go1.18でリリースされた待望の機能実際使ってますか?● 使い所が難しい...● 今のところユースケースがない...● 気はなってはいる...🤔標準ライブラリでの使い方を見てみよう💡
5timeパッケージでの利用例● atoiをジェネリクスを使って実装● []byteとstringの変換がいらない日付と時刻の操作を行うパッケージ
6timeパッケージでのご利益● パフォーマンスの向上● 可読性と簡潔性の向上● atoiをジェネリクスを使って実装● []byteとstringの変換がいらないhttps://github.com/golang/go/commit/72c58fb77192f7d17d87663c943360a48aae11dcMarshalJSONを高速化
7出来ないこと
8メソッドではジェネリクスは利用できないメソッドでジェネリクスは利用できないこれはダメ
9関数として定義するしかない👍ジェネリクスを使いたいなら関数に切り出す必要がある
10slices/mapsパッケージ● Go1.21で追加予定● sliceやmapに対する操作を提供
11標準ライブラリ特有の難しさmath.Abs/Min/Maxやlist.List等にもジェネリクス入れないの?使いどころはわかってきた💡🤔list.Listを例に考えてみる
12標準ライブラリ特有の難しさlist.Listはinterface{}型を利用して実装されている
13標準ライブラリ特有の難しさジェネリクスを使って実装し直すと後方互換性が失われる型が違うのでコンパイルできない
14考えられる解決策特に標準パッケージではジェネリクスへの移行は容易ではない解決策も議論されている● ジェネリクスを使って実装されたV2パッケージを用意● ジェネリクス用の関数を分けて定義する
15ジェネリクスの現在地とこれから標準ライブラリではジェネリクスの利用が始まっている● 今回紹介した例以外にもatomic.Pointer型で利用されている● slices/mapsが標準パッケージに取り込まれたジェネリクスを活用し始める良いタイミング!