• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go语言 struct结构体 能比较么 == 或 !=

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

同一个struct的2个实例能不能比较 ==  !=

答案:可以能、也可以不能

两个不同的struct的实例能不能比较 ==  !=

答案:可以能、也可以不能

虽然答案都一样,但是涉及到的知识点略有不同

如果结构体的所有成员变量都是可比较的,那么结构体就可比较

如果结构体中存在不可比较的成员变量,那么结构体就不能比较

结构体之间进行转换需要他们具备完全相同的成员(字段名、字段类型、字段个数)

大家注意看上图

t1 t2 是同一个struct的2个赋值相同的实例

他们本质就是结构体的一个“对象”,因为成员变量带有了不能比较的成员,所以只要写 == 就报错

t3 t4 虽然能用 == ,但是人家本质上是比较的指针类型,*t3 == *t4 一样的一写就报错

至于 

func DeepEqual(a1, a2 interface{}) bool

这个大家今后再展开细讲,我们只说,这个方法比较指针类型深度是否一致的情况

1: 指针1 == 指针2 结果为true

2: 指针1 指针2 所指向的值深度相等

满足其中的一条即 DeepEqual 结果为true

== 如果用来比较指针,比较的就是指针所指向的内存地址,而不是指针变量本身所在的内存地址

这一点你可以理解为和Java中 (对象 == 对象) 是一个道理的

既然2个指针所指向的内存都一样了,怎么可能不相等呢?

但是说了这么多,回到问题的本质,

虽然 DeepEqual方法可以达到比较值是否相等这样的效果,

但是对于结构体实例而言,因为含有不能比较的成员变量,所以 == 和 != 是不能用的

这里又延伸出来一个知识点

struct可以作为map的key么?

答案:可以,也不可以

struct必须是可比较的,才能作为key,否则编译时报错

什么是可比较

文档规范:https://golang.org/ref/spec#Comparison_operators


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
第九十八期:TIOBE11月榜单:C、Swift、Go、D与Rust起起伏伏发布时间:2022-07-10
下一篇:
Surface go 虚拟机安装发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap