1.deeply equal条件

reflect包里面有一个判断是否deeply equal的函数,对于不同的类型,deeply equal的定义如下。

类型 deeply equal条件
数组 对应的元素deeply equal
结构体 对应的域deeply equal
函数 都为nil
interface 实际的值deeply equal
map 同时满足以下条件:
1. 同时为nil或者同时不为nil
2.长度相同
3.同一个map,或者对应key的value deeply equal
指针 满足"=="对比,或者指向的值deeply equal
sliece 同时满足以下条件:
1. 同时为nil或者同时不为nil
2.长度相同
3.指向相同的底层数组,或者对应的元素deeply equal
数字、字符串、布尔值、channel 与普通的相等一样

注意:
1.不同的类型不可能deeply euqal。

  1. non-nil empty slice与nil slice并不deeply equal(比如[]byte{} and []byte(nil))

2. 额外思考

如果一个map deeply equal,能否说明所有的对应field都相等?
答案是不一定,因为有下面两种特殊的东西存在:

  1. 函数类型没法对比
  2. float类型可能不等于自身

所以如果把相同的map逐个key去对比,可能得出这个map不等于自身的情况。因此在设计deeply equal这个概念的时候在这方面也做了一些特殊说明:相同的slice或者map认为是deeply equal,而不再管他们的具体内容。


moonbamboo
37 声望2 粉丝

I am