1 回答

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
reflect.DeepEqual
cmp.Equal
比將結(jié)構(gòu)與循環(huán)進(jìn)行比較時(shí)更寬松(并且可以說(shuō)是不正確的)。
cmp.Equal
如果圖中的節(jié)點(diǎn)和邊集相同,則只會(huì)認(rèn)為重疊圖是等效的。注意:Node
和Edge
struct 都是此圖比較中的節(jié)點(diǎn)。
在您的示例中,2 個(gè)圖形/結(jié)構(gòu)重疊但wantEdge0
有一個(gè)額外的Edge
結(jié)構(gòu)作為根節(jié)點(diǎn)(前置)。
這是數(shù)據(jù)結(jié)構(gòu)中循環(huán)的縮減表示:
wantEdge0 := &main.Edge{ // n0
StartNode: &main.Node{ // n1
Low: &main.Edge{} // n2
},
}
wantEdge0.StartNode.Low.StartNode = wantEdge0.StartNode // n1
got := wantEdge0.StartNode.Low // n2
因此有兩個(gè)不同的周期:
wantEdge0 [n0] -> wantEdge0.StartNode [n1] -> got [n2] -> wantEdge0.StartNode [n1]
got [n2] -> wantEdge0.StartNode [n1] -> got [n2]
reflect.DeepEqual
這是一個(gè)簡(jiǎn)單的例子,演示了和之間的區(qū)別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
解決方案:我建議為您想要的結(jié)構(gòu)和測(cè)試輸入分配完全獨(dú)立的結(jié)構(gòu)。這樣want和got結(jié)構(gòu)就不會(huì)重疊,它們應(yīng)該按預(yù)期進(jìn)行比較。
- 1 回答
- 0 關(guān)注
- 142 瀏覽
添加回答
舉報(bào)