2022-07-30 (土)
GoのGenericsの型制約はinterfaceで表現しないといけないけど,自身の型が表現できないの地味に面倒.
単純な例だと,比較できる型を
type Comparable interface {
Equals(Comparable) bool
}
func Compare[T Comparable](a, b T) bool {
return a.Equals(b)
}
と書きたくなるけど,func (v Foo) Equals(other Foo) bool ではく,func (v Foo)Equals (other Comparable) bool を実装しないといけなくてGenericsの嬉しさがなくなる.
なので,
type Comparable[T any] interface {
Equals(T) bool
}
func Compare[T Comparable[T]](a, b T) bool {
return a.Equals(b)
}
としないといけない.このanyが分かりにくいので,できれば Comparable[T any] を Comparable[T Comparable[T]] と書きたいのだけど,invalid recursive type になってしまう.