为了账号安全,请及时绑定邮箱和手机立即绑定

计算递归定义的自定义类型的不同对象数量的惯用方法

计算递归定义的自定义类型的不同对象数量的惯用方法

Go
慕婉清6462132 2022-01-10 17:37:03
据我了解,我无法在 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{})它遵循间接。但是,这种方法效率低下,因为使用了重度反射。就您而言,我认为没有任何干净优雅的解决方案可以满足您的需求。


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号