当将 struct 与周期进行比较时,reflect.DeepEqual
比cmp.Equal
更宽松(可以说是不正确的).
如果图中的 node 和边的集合是相同的,那么cmp.Equal
将只考虑重叠图等价.Note:Node
和Edge
struct 都是此图比较中的 node .
在您的示例中,两个图形/ struct 重叠,但wantEdge0
is有一个额外的Edge
struct 作为根 node (带前缀).
以下是数据 struct 中周期的简化表示:
wantEdge0 := &main.Edge{ // n0
StartNode: &main.Node{ // n1
Low: &main.Edge{} // n2
},
}
wantEdge0.StartNode.Low.StartNode = wantEdge0.StartNode // n1
got := wantEdge0.StartNode.Low // n2
因此有两个不同的周期:
wantEdge0 [n0] -> wantEdge0.StartNode [n1] -> got [n2] -> wantEdge0.StartNode [n1]
got [n2] -> wantEdge0.StartNode [n1] -> got [n2]
下面是一个简单的例子,演示了reflect.DeepEqual
和cmp.Equal
之间的区别:
package main
import (
"fmt"
"reflect"
"github.com/google/go-cmp/cmp"
)
type Node struct {
Next *Node
Value int
}
func main() {
a0 := &Node{}
a1 := &Node{}
a2 := &Node{}
a0.Next = a1
a1.Next = a2
a2.Next = a1
b1 := &Node{}
b2 := &Node{}
b1.Next = b2
b2.Next = b1
fmt.Println("DeepEqual\tcmp.Equal")
fmt.Printf("\t%v\t%v\t\tIndependent graphs\n", reflect.DeepEqual(a1, b1), cmp.Equal(a1, b1))
fmt.Printf("\t%v\t%v\t\tSame graph, different root\n", reflect.DeepEqual(a1, a2), cmp.Equal(a1, a2))
fmt.Printf("\t%v\t%v\t\tSame graph prepend vs no prepend\n", reflect.DeepEqual(a0, a1), cmp.Equal(a0, a1))
}
输出:
$ ./compare
DeepEqual cmp.Equal
true true Independent graphs
true true Same graph, different root
true false Same graph prepend vs no prepend
Solution:我建议为want struct 和测试输入分配完全独立的 struct .这样want和got struct 就不会重叠,它们应该按预期进行比较.
参考资料: