deeply equal(深度相等)

moonbamboo · · 979 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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,而不再管他们的具体内容。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:moonbamboo

查看原文:deeply equal(深度相等)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

979 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传