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
になってしまう.