2022-06 << 2022-07 >> 2022-08

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

2022-06 << 2022-07 >> 2022-08