Golang怎么判断struct/slice/map是否相等(golang,slice,struct,开发技术)

时间:2024-04-26 02:01:33 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    Golang%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%ADstruct%2Fslice%2Fmap%E6%98%AF%E5%90%A6%E7%9B%B8%E7%AD%89

如果类型不同,那么编译时就会报错。

示例代码:

import"fmt"

经常见到使用==的类型一般是:string,int等基本类型。struct有时候可以用有时候不可以。slicemap使用 ==会报错。

因为slice和map不止是需要比较值,还需要比较len和cap,层级比较深的话还需要递归比较,不是简单的==就可以比较的,所以他们各自之间是不可以直接用==比较的,slice和map只能和nil使用==。

切片之间不允许比较。切片只能与nil值比较。

map之间不允许比较。map只能与nil值比较。

channel是引用类型,对比的是存储数据的地址。channel是可以使用==的,只要类型一样就可以。

结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存。

实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体实例与实例间的

内存是完全独立的。对结构体进行&取地址操作时,视为对该类型进行一次 new 的实例化操作

因此:go中的结构体: v = Struct {}, v = &Struct{} 这个两种写法是等价的。

简单结构的结构体,里面都是值类型或者指针的话,是可以使用 ==的

结构体中含有slice或者map,都是不可以用==

示例代码:

reflect包提供的深度对比(递归)的方法,适用于go中的slice,map,struct,function的对比。

对比规则

相同类型的值是深度相等的,不同类型的值永远不会深度相等。

当数组值array的对应元素深度相等时,数组值是深度相等的。

当结构体struct值如果其对应的字段(包括导出和未导出的字段)都是深度相等的,则该值是深度相等的。

当函数func值如果都是零,则是深度相等;否则就不是深度相等。

当接口interface值如果持有深度相等的具体值,则深度相等。

当切片slice序号相同,如果值,指针都相等,那么就是深度相等的

当哈希表map相同的key,如果值,指针都相等,那么就是深度相等的。

通过以上规则可以看到,reflect.DeepEqual是可以比较struct的,同时也可以用来比较slicemap

示例代码:

go-cmp是 Google 开源的比较库,它提供了丰富的选项。

对比规则

在经过路径过滤,值过滤和类型过滤之后,会生一些忽略、转换、比较选项,如果选项中存在忽略,则忽略比较,如果转换器和比较器的数据大于1,则会panic(因为比较操作不明确)。如果选项中存在转换器,则调用转换器转换当前值,再递归调用转换器输出类型的Equal。如果包含一个比较器。则比较使用比较器比较当前值。否则进入下一比较阶段。

如果比较值有一个(T) Equal(T) bool 或者 (T) Equal(I) bool,那么,即使x与y是nil,也会调用x.Equal(y)做为结果。如果不存在这样的方法,则进入下一阶段。

在最后阶段,Equal方法尝试比较x与y的基本类型。使用go语言的 == 比较基本类型(bool, intX, float32,float64, complex32,complex64, string, chan)。

在比较struct时,将递归的比较struct的字段。如果结构体包含未导出的字段,函数会panic可以通过指定cmpopts.IgnoreUnexported来忽略未导出的字段,也可以使用cmp.AllowUnexported来指定比较未导出的字段。

示例代码:

安全:cmp.Equal()函数不会比较未导出字段(即字段名首字母小写的字段)。遇到未导出字段,cmp.Equal()直接panic,reflect.DeepEqual()会比较未导出的字段。

强大:cmp.Equal()函数提供丰富的函数参数,让我们可以实现:忽略部分字段,比较零值,转换某些值,允许误差等。

共同点:两种比较类型,都会比较:对象类型,值,指针地址等。切片会按照索引比较值,map是按照key相等比较值。

简单类型的==对比速度最快

复杂类型,自己知道结构之后写的自定义对比速度次之

复杂结构且不确定结构的,使用cmp.Equal()或者reflect.DeepEqual()都可以,就是效率低点

assert.Equal()底层使用的就是reflect.DeepEqual()

本文:Golang怎么判断struct/slice/map是否相等的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:怎么用Node转换Excel成JSON下一篇:

5 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18