GoのinterfaceとGenericsの内部構造と進化
資料
/icons/hr.icon
実務でany型の使用が散見されたので登壇した
意図しない型が入ってくると予期しない動作になってしまうのでジェネリクスで対応するのが無難
型の内部実装
型のメタデータが全て含まれた構造体がsrc/trntime/type.goで定義されている
拡張型は上記の型が埋め込まれた構造体として定義されている
Genericsの内部実装
辞書とGcshape Stenciling
辞書を使って純粋なモノモーフィゼーションを避けて1つの関数インスタンスを複数の型で動かせるようにしている
Featherwight goが論文
コンパイラのInstantiate関数でジェネリック型や関数に具体的な型引数を適用してインスタンス化する。失敗するとpanicを起こす
readerDictで辞書型を定義している
Genericsの導入前
空のインタフェースを使って抽象化するしかなかったのでpanicの危険性があった
Genericsの導入後
型制約をコンパイル時にかせるようになった
メソッドの集合から型の集合に変わった
ジェネリクスを検討した後の合図としてanyと書くと良い
Generics利用の一般的なガイドラインがあるらしい(後で調べる)