在GO 1.18和GO 1.19中,我可以在编译时确保类型为strictly comparable,即它支持==
和!=
运算符,而这些运算符保证为not panic at run time.
例如,这有助于避免无意中将字段添加到可能导致不必要的死机的 struct 中.
我只是try 用它实例化comparable
:
// supports == and != but comparison could panic at run time
type Foo struct {
SomeField any
}
func ensureComparable[T comparable]() {
// no-op
}
var _ = ensureComparable[Foo] // doesn't compile because Foo comparison may panic
由于comparable
限制的定义,这在GO 1.18和1.19中是可能的:
预声明的接口类型可比较表示所有可比较的非接口类型的集合
尽管GO 1.18和1.19规范没有提到不是接口但也不具有严格可比性的类型,例如[2]fmt.Stringer
或struct { foo any }
,GC编译器确实拒绝将这些类型作为comparable
的参数.
有几个例子的操场:https://go.dev/play/p/_Ggfdnn6OzZ个
在Go 1.20中,实例化comparable
将与broader notion of comparability对齐.这使得ensureComparable[Foo]
编译even though I don't want it to.
有没有办法静态地确保与GO 1.20的严格可比性?