Go接口之nil != nil

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

本文来自“灰子学技术”,原文链接如下所示:https://mp.weixin.qq.com/s/ZBd1UcIJFk_DonkxVNgERA

一、引出话题:

在开始这个话题之前,我们先看一段代码以及其输出结果,代码如下所示:

Output: 

从上面的输出结果来看,GetA()返回的类型为*A就算赋值为nil,也不等于nil。

看到这里笔者觉得很奇怪,明明是GetA()返回值是nil,为什么nil的判断条件是false呢?

二、原因分析:

在研究了interface之后,笔者发现了真相,原来Go语言中的interface是不是nil的条件,不单单是interface中的值是nil,类型还需要是nil才行。

通过Go的官方文档描述来看,原因如下:// 原文链接:https://golang.org/doc/faq#nil_error

首先,interface有两个核心元素,一个是type,一个是value,在为interface赋值的时候,首先会将类型付给type,其次才会将数值赋值给value。

例如:a := interface{} 

a = 10 // 此时a.type = int, a.value = 10

其次,interface == nil的成立条件是,type和value同时都为nil,只要有中一个不为nil,那么interface就不是nil。

验证代码如下所示:

通过上面代码的输出,我们能够看到GetA()返回的空接口,type已经被赋值了,就算value还是nil,接口a依然不会是nil。而对于空接口b来说,类型和数值都是空值,那么b就是一个nil。(备注:b的value值是invalid的原因是,在运行阶段空接口并没有找到这个nil是什么类型,也就没有办法给b.value赋值,所以才会打印invalid reflect.Value。)

三、补充知识:

对于接口变量来说,如果通过一个指向nil的数据结构去赋值的话,这个接口变量还是一个指针类型,代码如下所示:

规则整理:

1)指针的判断,都涉及到type和value。

2)接口指针之间的判等,要基于type与value,一个不同则不等。

3)接口指针与其对应实现的结构体指针,可以进行判等操作。

灰子学技术    公众号:

 

 


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

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

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