跟着阿昌学习day2-【go基础知识】结构体比较

       我们平常写代码一般不会把两个结构体拿出来比较,不过go的结构体比较是面试题中比较高频的了,所以今天我们就来愉快的总结一下吧!

一、是否可以比较

        两个结构体比较的前提就是要两个结构体能比较,下面就列举所有不能比较的情况,除了下面的情况,其他的都能比较(比较方法为 == 比较和reflect.DeepEqual 比较)

        1.不同结构体之间不能比较(指针除外)

        2.同一结构体中如果有map,slice,func 这三种类型的任意一种成员变量都不能用 == 比较(可以用reflect.DeepEqual 比较,因为slice和map不止是需要比较值,还需要比较len和cap,层级比较深的话还需要递归比较,不是简单的==就可以比较的,具体的我们可以参照reflect.DeepEqual()中实现的切片对比代码。 另外有大佬也说会出现循环引用的问题。)

二、比较是否相等

        如果两个结构体之间可以比较,那么下面的情况下才会为true,其他的都是false

        1.如果是 == 比较必须地址和值都相等才会为true(注:如果有指针类型,那比较的是指针地址)

        2.如果两个结构体是同一个结构体初始化来的或者强转来的(保证类型相同),这时如果对应两个结构体间各个成员变量的值都相等,用reflect.DeepEqual比较会为true

三、总结

        一般我们比较就是为了比较内容是否完全一样,所有无脑用reflect.DeepEqual比较就好了,简单粗暴,唯一的缺点就是效率差,没办法 go的反射一言难尽

             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值