大佬教程收集整理的这篇文章主要介绍了如何使用 go-сmp 来比较这样的结构?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下简化的结构集
type S0 struct {
UUID uuID.UUID
F00 int
F01 int
}
type S1 struct {
S0
F10 int
F11 int
}
type S2 struct {
S0
F20 int
}
<...>
type SN struct {
S0
FN0 int
<...>
FNM int
}
一个结构体 S0
等于另一个结构体 S0
,如果它们的所有字段(UUID
,F0i
)都相等。结构体 Sk (k=1..N)
等于结构体 Sk
,如果它们的部分 Sk.S0
相等,即使它们的所有字段 Fki
都不相等。但是如果它们的部分 Sk.S0
不相等,那么结构仍然是相等的,如果它们的所有字段 Fki
都相等。如果 S0
,则结构 Sk
等于任何其他结构 Sk.S0 == S0
。 struct Si
永远不等于 struct Sj (i != j)
,即使 Si.S0 == Sj.S0
(理论上,这在当前架构中通常是不现实的,但以防万一)。所有结构都实现了一个通用接口 I
。
我想使用 go-cmp 编写以下等式函数。
func Equali(i1 I,i2 I) bool
我为每个结构编写了以下比较函数,它们看起来差不多,但是如何将它们组合成一个函数 Equali
并且不会得到错误“适用选项的模糊集”?
func EqualS0(s0_a S0,s0_b S0) bool {
return cmp.Equal(s0_a,s0_b)
}
func EqualS1(s1_a S1,s1_b S1) bool {
if EqualS0(s1_a.S0,s1_b.S0) {
return true
}
return cmp.Equal(s1_a,s1_b,cmpopts.IgnoreFIElds(S1{},"S0.UUID","S0.F00","S0.F01"))
}
美好的一天!
这是使用 map[string] 接口的示例代码。你也可以看到它here。
package main
import (
"fmt"
"reflect"
"sort"
)
func main() {
one := map[string]interface{} {
"uuid":"123-456-789","F00":0,"F01":1,"F10":3,}
other := map[string]interface{} {
"uuid":"987-654-321","F00": 2,"F01": 3,"F10": 3,}
fmt.Println("Result of Full Comparison = ",compare(one,other))
fmt.Println("Result of Part Comparison = ",compareIgnoreSome(one,other,[]string{"uuid","F00","F01"}))
}
func compare(a map[string]interface{},b map[string]interface{}) bool {
for k1,v1 := range a{
if v2,exists := b[k1]; !exists {
return false
} else {
if !reflect.DeepEqual(v1,v2) {
return false
}
}
}
return true
}
func compareIgnoreSome(a map[string]interface{},b map[string]interface{},some []string) bool {
sort.Strings(some)
for k1,v1 := range a{
if i := sort.SearchStrings(some,k1); i>=0 {
continue
}
fmt.Println("target key= ",k1)
if v2,v2) {
fmt.Printf("Diff %v,%v\n",v1,v2)
return false
}
}
}
return true
}
以上是大佬教程为你收集整理的如何使用 go-сmp 来比较这样的结构?全部内容,希望文章能够帮你解决如何使用 go-сmp 来比较这样的结构?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。