程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用 go-сmp 来比较这样的结构?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用 go-сmp 来比较这样的结构??

开发过程中遇到如何使用 go-сmp 来比较这样的结构?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用 go-сmp 来比较这样的结构?的解决方法建议,希望对你解决如何使用 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,如果它们的所有字段(UUIDF0i)都相等。结构体 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,请注明来意。
标签: