Slice,Map,函数三种引用类型以及含有以上三种类型的结构体和数组不能直接用==比较,只能用reflect.deepEqual进行比较。
channel可以用==比较,且只有两个通道是由同一个 make 创建才相等;
接口可以用==比较,且只有两个接口具有相同的动态类型和动态值两者才相等;并且当 interface 与非 interface 比较时,会将非interface 转换成 interface,然后再按照 两个 interface 比较 的规则进行比较;接口的动态类型和动态值都为nil,接口才是nil。
结构体和数组作为复合类型,能否比较以其内部的元素是否能比较决定,且数组要求长度相同。
空结构体不可相互比较:
-
若逃逸到堆上,空结构体则默认分配的是
runtime.zerobase
变量,是专门用于分配到堆上的 0 字节基础地址。因此两个空结构体都是runtime.zerobase
,一比较当然就是 true 了。 -
若没有发生逃逸,也就分配到栈上,在 Go 编译器的代码优化阶段,会对其进行优化,直接返回 false。并没有比较的意义了。