Golang 中判断两个结构体相等的方法

 更新时间:2023年08月30日 11:20:20   作者:农夫小田  
这篇文章主要介绍了Golang 中如何判断两个结构体相等,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

结论

golang中,哪些数据类型是可比较的,哪些是不可比较的:

  • 可比较:Integer,Floating-point,String,Boolean,Complex(复数型),Pointer,Channel,Interface,Array
  • 不可比较:Slice,Map,Function

同一个struct的两个实例能不能比较

type S struct {
    Name    string
    Age     int
    Address *int
}
func main() {
    a := S{
        Name:    "aa",
        Age:     1,
        Address: new(int),
    }
    b := S{
        Name:    "aa",
        Age:     1,
        Address: new(int),
    }
   fmt.Println(a == b)   // false
}

输出false,说明:

  • 可以比较,因为都是基础数据类型
  • false:因为其中的指针变量 Address 的值不同,所以 a != b,如果a b 在初始化时把 Address 去掉(不给 Address 初始化),那么这时 a == b 为true, 因为ptr变量默认值是nil,又或者给 Address 成员变量赋上同一个指针变量的值,也是成立的。
type S struct {
    Name    string
    Age     int
    Address *int
   Data    []int
}
func main() {
    a := S{
        Name:    "aa",
        Age:     1,
        Address: new(int),
      Data:    []int{1, 2, 3},
    }
    b := S{
        Name:    "aa",
        Age:     1,
        Address: new(int),
      Data:    []int{1, 2, 3},
    }
   fmt.Println(a == b)  // invalid operation: a == b (struct containing []int cannot be compared)
}

报错:Slice,Map,Function不可比较

结构体比较推荐用法

type S struct {
    Name    string
    Age     int
    Address *int
   Data    []int
}
func main() {
    a := S{
        Name:    "aa",
        Age:     1,
        Address: new(int),
      Data:    []int{1, 2, 3},
    }
    b := S{
        Name:    "aa",
        Age:     1,
        Address: new(int),
      Data:    []int{1, 2, 3},
    }
   fmt.Println(reflect.DeepEqual(a, b))  // true
}

DeepEqual函数用来判断两个值是否深度一致。具体比较规则如下:

  • 不同类型的值永远不会深度相等
  • 当两个数组的元素对应深度相等时,两个数组深度相等
  • 当两个相同结构体的所有字段对应深度相等的时候,两个结构体深度相等
  • 当两个函数都为nil时,两个函数深度相等,其他情况不相等(相同函数也不相等)
  • 当两个interface的真实值深度相等时,两个interface深度相等
  • map的比较需要同时满足以下几个
  • -两个map都为nil或者都不为nil,并且长度要相等
  • -相同的map对象或者所有key要对应相同
  • -map对应的value也要深度相等
  • 指针,满足以下其一即是深度相等
  • -两个指针满足go的==操作符
  • -两个指针指向的值是深度相等的
  • 切片,需要同时满足以下几点才是深度相等
  • -两个切片都为nil或者都不为nil,并且长度要相等
  • -两个切片底层数据指向的第一个位置要相同或者底层的元素要深度相等
  • -注意:空的切片跟nil切片是不深度相等的
  • 其他类型的值(numbers, bools, strings, channels)如果满足go的==操作符,则是深度相等的。要注意不是所有的值都深度相等于自己,例如函数,以及嵌套包含这些值的结构体,数组等

到此这篇关于Golang 中如何判断两个结构体相等的文章就介绍到这了,更多相关go判断两个结构体相等内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go语言中的interface使用实例

    go语言中的interface使用实例

    这篇文章主要介绍了go语言中的interface使用实例,go语言中的interface是一组未实现的方法的集合,如果某个对象实现了接口中的所有方法,那么此对象就实现了此接口,需要的朋友可以参考下
    2015-05-05
  • Golang数组的传递详解

    Golang数组的传递详解

    今天小编就为大家分享一篇关于Golang数组的传递详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Go语言设计模式之实现观察者模式解决代码臃肿

    Go语言设计模式之实现观察者模式解决代码臃肿

    今天学习一下用 Go 实现观察者模式,观察者模式主要是用来实现事件驱动编程。事件驱动编程的应用还是挺广的,除了我们都知道的能够用来解耦:用户修改密码后,给用户发短信进行风险提示之类的典型场景,在微服务架构实现最终一致性、实现事件源A + ES
    2022-08-08
  • go解析YAML文件(多文档解析)

    go解析YAML文件(多文档解析)

    本文介绍了如何使用GO语言和client-go库处理YAML文件,特别是在Kubernetes环境下,分析了YAML的特点,如简洁性、易读性、可嵌套性等,并展示了相关代码实现,包括单文档和多文档的处理方法,感兴趣的可以了解一下
    2024-10-10
  • Golang通过小程序获取微信openid的方法示例

    Golang通过小程序获取微信openid的方法示例

    这篇文章主要介绍了Golang通过小程序获取微信openid的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Go Println和Printf的区别详解

    Go Println和Printf的区别详解

    这篇文章主要介绍了Go Println和Printf的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go实现一个轻量级并发任务调度器(支持限速)

    Go实现一个轻量级并发任务调度器(支持限速)

    本文主要介绍了Go实现一个轻量级并发任务调度器(支持限速),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Golang中for循环的用法示例详解

    Golang中for循环的用法示例详解

    for循环就是让一段代码循环的执行,接下来通过本文给大家讲解Golang中for循环的用法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 一文带你掌握GoLang中的指针

    一文带你掌握GoLang中的指针

    针是 Go 编程语言的重要组成部分,它们提供了一种直接引用和操作内存中数据的方法,在这篇文章中,我们将探讨一些技巧和技巧,以掌握 GoLang 中的指针并编写高效的代码,需要的可以参考一下
    2023-05-05
  • go语言编程实现递归函数示例详解

    go语言编程实现递归函数示例详解

    这篇文章主要为大家介绍了go语言编程实现递归函数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论