Golang 中判断两个结构体相等的方法
作者:农夫小田
这篇文章主要介绍了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判断两个结构体相等内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!