我一直在reflect.DeepEqual使用回圈指標深入比較結構。由于這不適用于地圖并且為了獲得更好的測驗輸出,我已切換到go-cmp.
現在我必須注意,即使cmp.Equal它應該是 的替代品reflect.DeepEqual,但在前者正常作業的情況下,在這種情況下會有不同的結果,即使它實際上是完全相等的。
誰能告訴我為什么在這種情況下結果不同,理想情況下,如何解決?
Go 操場中的代碼:https: //play.golang.com/p/rLWKwMlAfwu
(更新為使用 fmt.Printf(),因為我無法testing在操場上跑步)
差異的輸出:
StrongConnect() mismatch (-want got):
&?ref#0?main.Edge{
StartNode: &?ref#1?main.Node{
Variable: 1,
- Low: &?ref#0: 0xc00005c120?(...),
Low: &?ref#0: 0xc00005c120?(...),
High: &{StartNode: &?ref#1?(...), EndNode: &{Variable: 2}, EdgeType: 1, Weight: 1},
},
EndNode: &{Variable: 2},
EdgeType: 0,
Weight: 1,
}
uj5u.com熱心網友回復:
reflect.DeepEqualcmp.Equal比將結構與周期進行比較時更加寬松(并且可以說是不正確的)。
cmp.Equal如果圖中的節點和邊集相同,則只會考慮重疊圖等效。注意:Node和Edge結構都是此圖表比較中的節點。
在您的示例中,兩個圖形/結構重疊,但wantEdge0有一個額外的Edge結構作為根節點(前置)。
這是資料結構中回圈的縮減表示:
wantEdge0 := &main.Edge{ // n0
StartNode: &main.Node{ // n1
Low: &main.Edge{} // n2
},
}
wantEdge0.StartNode.Low.StartNode = wantEdge0.StartNode // n1
got := wantEdge0.StartNode.Low // n2
因此有2個不同的周期:
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
解決方案:我建議為您想要的結構和測驗輸入分配完全獨立的結構。這樣,want和got結構不會重疊,它們應該按預期進行比較。
參考:
- https://github.com/google/go-cmp/commit/5a6f75716e1203a923a78c9efb94089d857df0f6
- https://github.com/google/go-cmp/issues/74
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/460507.html
