最近ちょろっとgo 1.18beta1を使ってGenericsに触れたので、GoのGenerics関連の実装パターンを紹介する。 Generics facilitators in Go@rakyll氏が紹介していたFacilitatorsというパターンだ。

といってもそんなに難しいものではない。理解すべき点は2つ。

  • Goではメソッドに型パラメータを持たせられないという制約がある
  • 代わりにレシーバをパラメータ化できる

ジェネリックなメソッドがほしいときは一度ジェネリックな型の値を返し、その型で目的のメソッドを実装する。 この中間で一度挟んでいる型をFacilitatorと呼んでいる。

具体的なコード例を見たほうがわかりやすいので、そのあたりは是非先述のブログを参照していただきたい。


ところで、なぜこのような制限があるのかはよくわからない。コンパイル時に型パラメータを解決する文脈として、レシーバと引数とで一緒に処理できないみたいな都合の悪さがあるのだろうか。

個人的には全然困らないというか、むしろ1つの型が汎用的になりすぎるのを防ぎ、責務を分散・移譲させる圧力にもなるので結果的に良い仕様なんじゃないかと感じた。