据我了解,我无法在 Go 中为用户定义的类型定义相等性。那么计算某些自定义类型(可能是递归定义)的不同对象数量的惯用方法是什么。这是我正在尝试做的事情的一个例子。package mainimport "fmt"type tree struct { left *tree right *tree}func shapeOf(a tree) string { temp := "{" if a.left != nil { temp += shapeOf(*(a.left)) } temp += "}{" if a.right != nil { temp += shapeOf(*(a.right)) } temp += "}" return temp;}func main() { a := tree{nil, nil} b := tree{nil, &a} c := tree{nil, nil} d := tree{nil, &c} e := tree{nil, nil} f := tree{&e, nil} s := make(map[string]bool) s[shapeOf(b)] = true s[shapeOf(d)] = true s[shapeOf(f)] = true fmt.Println(len(s)) // As required, prints 2 because the first two trees have the same shape}它可以工作,但是字符串的使用非常难看,而且可能效率也很低。显然我可以很容易地编写一个递归方法来判断两棵树是否相等——比如func areEqual(a, b tree) bool但这不会让我使用树作为地图键。做这种事情的惯用 Go 方法是什么?
1 回答

守着星空守着你
TA贡献1799条经验 获得超8个赞
你不能为用户定义的类型定义相等,因为它已经被 go 定义了。基本上,有关它的所有信息都在可比部分中进行了解释。
短篇小说:如果可以比较两个结构值的字段(没有切片、映射或函数),则可以比较两个结构值。相等性也是一样的:如果两个结构的字段相等,则它们是相等的。在您的情况下,问题在于,为了比较指针,Golang 比较的是内存地址,而不是它们指向的结构。
那么,这是否可以计算某个 struct 的不同值?是的,如果结构不包含嵌套切片、映射、函数或指针。对于递归类型,这是不可能的,因为你不能定义这样的东西:
type tree struct {
left tree
right tree
}
测试递归类型相等性的惯用方法是使用reflect.DeepEqual(t1, t2 interface{})它遵循间接。但是,这种方法效率低下,因为使用了重度反射。就您而言,我认为没有任何干净优雅的解决方案可以满足您的需求。
- 1 回答
- 0 关注
- 144 浏览
添加回答
举报
0/150
提交
取消