Golang 中如何判断两个结构体相等

结论

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

  1. 可比较:Integer,Floating-point,String,Boolean,Complex(复数型),Pointer,Channel,Interface,Array
  2. 不可比较: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,说明:

  1. 可以比较,因为都是基础数据类型
  2. 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的==操作符,则是深度相等的。要注意不是所有的值都深度相等于自己,例如函数,以及嵌套包含这些值的结构体,数组等
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值