給定一個使用結構作為鍵的映射,其中結構的值是指向另一個結構的指標:
type Dog struct {
Name string
}
type Cat struct {
Name string
}
type MapKey struct {
dog *Dog
cat *Cat
}
myMap := make(map[MapKey]int)
我將如何使用 cmp 包使以下地圖相等,因為 MapKey 具有相同的值(reflect.DeepEquals 或 cmp.Equals),它們被認為是相等的?
keyOne := MapKey{
&Dog{Name: "bob"},
&Cat{Name: "clive"},
}
keyTwo := MapKey{
&Dog{Name: "bob"},
&Cat{Name: "clive"},
}
got := map[MapKey]int{
keyOne: 1,
}
want := map[MapKey]int{
keyTwo: 1,
}
在 cmp 檔案中,它說我可以使用 cmpopts.SortMaps (https://pkg.go.dev/github.com/google/go-cmp/cmp#Equal),但是我不明白這與我的情景。
我試過在 MapKey 結構上定義一個自定義的 Equals 函式,但它永遠不會被呼叫。
去游樂場重現這個: https ://go.dev/play/p/qMxaya3S26M
uj5u.com熱心網友回復:
使用 type的cmp.Equal引數呼叫map[MapKey]int,而不是MapKey
所以自定義Equal函式必須在 type 上定義map[MapKey]int。
但是要定義這個函式,我們需要從map[MapKey]int.
這是完整作業示例的游樂場:https ://go.dev/play/p/deteHANWQ_3
type MapKeyInt map[MapKey]int
func (m MapKeyInt) Equal(other MapKeyInt) bool {
if len(m) != len(other) {
return false
}
keys, keysOther := make([]MapKey, 0), make([]MapKey, 0)
values, valuesOther := make([]int, 0), make([]int, 0)
for k, v := range m {
keys = append(keys, k)
values = append(values, v)
}
for k, v := range other {
keysOther = append(keysOther, k)
valuesOther = append(valuesOther, v)
}
for i := 0; i < len(m); i {
if (keys[i].dog.Name != keysOther[i].dog.Name) || (keys[i].cat.Name != keysOther[i].cat.Name) {
return false
}
if values[i] != valuesOther[i] {
return false
}
}
return true
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/530684.html
標籤:单元测试去去cmp
上一篇:原子設計模式的反應鉤子單元測驗
