考虑以下代码片段,适用于go1.18beta2 linux/amd64版本。
type Vector[T comparable] struct {
data_ []T
}
func (v *Vector[T]) Contains(e T) bool {
for _, x := range v.data_ {
if x == e {
return true
}
}
return false
}
func TestVector(t *testing.T) {
v2 := Vector[Vector[int]]{}
}
这段代码无法编译并报错:“Vector[int] does not implement comparable”,这是因为
Vector 没有定义相等运算符。然而,我找不到如何定义它们的方法。
问题:这种创建可比较结构体的方法是否被禁止了?为什么?或者是文档尚未编写?
data_ *[]T
,则可以使Vector[T]
可比较。根据上面引用的规范,指针是可比较的。但我不确定是否更可取,因为 1)初始化和使用变得更加繁琐和冗长,2)指针比较测试内存地址是否相同,因此T
是另一个Vector[T]
实例时,x==e
基本上检查这两个结构体是否持有完全相同的切片指针。经验可能有所不同。示例 https://gotipplay.golang.org/p/zSx2mjLmptz - blackgreenNaN
注意事项:https://go.dev/play/p/SlZCtn6PEUe - jub0bsx == e
可以比较两个Vector[T]
。 OP最初失败是因为该结构体具有切片字段,因此采用了明显不好的技巧将该字段更改为切片指针。 - blackgreen