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。
- non-nil empty slice与nil slice并不deeply equal(比如[]byte{} and []byte(nil))
2. 额外思考
如果一个map deeply equal,能否说明所有的对应field都相等?
答案是不一定,因为有下面两种特殊的东西存在:
- 函数类型没法对比
- float类型可能不等于自身
所以如果把相同的map逐个key去对比,可能得出这个map不等于自身的情况。因此在设计deeply equal这个概念的时候在这方面也做了一些特殊说明:相同的slice或者map认为是deeply equal,而不再管他们的具体内容。
有疑问加站长微信联系(非本文作者)