我们平常写代码一般不会把两个结构体拿出来比较,不过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的反射一言难尽