猿问

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

据我了解,我无法在 Go 中为用户定义的类型定义相等性。那么计算某些自定义类型(可能是递归定义)的不同对象数量的惯用方法是什么。这是我正在尝试做的事情的一个例子。


package main


import "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 方法是什么?


慕婉清6462132
浏览 145回答 1
1回答

守着星空守着你

你不能为用户定义的类型定义相等,因为它已经被 go 定义了。基本上,有关它的所有信息都在可比部分中进行了解释。短篇小说:如果可以比较两个结构值的字段(没有切片、映射或函数),则可以比较两个结构值。相等性也是一样的:如果两个结构的字段相等,则它们是相等的。在您的情况下,问题在于,为了比较指针,Golang 比较的是内存地址,而不是它们指向的结构。那么,这是否可以计算某个 struct 的不同值?是的,如果结构不包含嵌套切片、映射、函数或指针。对于递归类型,这是不可能的,因为你不能定义这样的东西:type tree struct {    left tree    right tree}测试递归类型相等性的惯用方法是使用reflect.DeepEqual(t1, t2 interface{})它遵循间接。但是,这种方法效率低下,因为使用了重度反射。就您而言,我认为没有任何干净优雅的解决方案可以满足您的需求。
随时随地看视频慕课网APP

相关分类

Go
我要回答