一、引出话题:

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

从上面的输出结果来看,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接口之nil != nil相关推荐

  1. (0047)iOS开发之nil/Nil/NULL的区别

    小结: 1.oc最好用nil   [ nil  任意方法],不会崩溃 nil是一个对象值. NULL是一个通用指针(泛型指针). 2. NSNULL,NULL和nil在本质上应该是一样的,NULL和n ...

  2. id nil Nil SET IMP 等概念

    来看看 Objective-C 语言中的头文件 objc.h 的定义 : // objc.h typedef struct objc_class *Class; typedef struct objc ...

  3. go每日新闻(2021-02-05)——Golang 中 nil==nil 是对是错?

    每日一谚: Go对OO提供了另类的支持:有方法(method)无类(class),有接口(interface)但无类型体系,代码可重用,但不通过继承的方式. go中文网每日资讯–2021-02-05 ...

  4. iOS中nil Nil NULL 区别

    为什么80%的码农都做不了架构师?>>>    一.nil 当一个对象置为nil时,这个对象的内存地址就会被系统收回.置空之后是不能进行retain,copy等跟引用计数有关的任何操 ...

  5. IOS 学习笔记 2015-03-20 O之 nil,Nil,NULL,NSNull

    1.oc最好 用nil   [ nil  任意方法],不会崩溃  nil 是一个对象值. NULL是一个通用指针(泛型指针). 2. NSNULL,NULL和nil在本质上应该是一样的,NULL和ni ...

  6. nil/Nil/NULL/NSNull的来历

    学过C的同学都知道,C是用0来表示不存在的原始值.而NULL作为空指针,在指针环境中也相当于0值.其实NULL和0的值都是一样的.但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值 ...

  7. go语言一个包含nil指针的接口不是nil接口的理解

    结合<go语言圣经>书中7.5.1节的说明和下面的代码,认真分析理解 package mainimport ("bytes""fmt""i ...

  8. IOS中类和对象还有,nil/Nil/NULL的区别

    转自:http://blog.sina.com.cn/s/blog_5fb39f910101akm1.html 类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性 ...

  9. iOS开发 nil Nil NULL NSNull 的使用

    nil: A null pointer to an Objective-C object. ( #define nil ((id)0) ) nil 是一个对象值. Nil: A null pointe ...

最新文章

  1. 大厂首发:kafka消费组订阅多个topic
  2. python培训学费多少钱-深圳龙华新区python编程培训机构,从哪几方面选择好学校...
  3. HDU 4873 ZCC Loves Intersection(JAVA、大数、推公式)
  4. 织梦多个栏目arclist调用副栏目不显示的解决办法
  5. tf.nn.conv2d() / tf.nn.depthwise_conv2d() 和 Batchsize效益
  6. 构造代码块会想你所想
  7. python中的内建函数
  8. element-ui clearable 不显示_从ElementUI的loading组件说起
  9. fidde调试手机_实操:手机上用Fiddler调试页面(嘎)
  10. 精品教程--Android组件详解
  11. RedHat5 升级OpenSSH服务
  12. Spark键值对RDD的转化操作
  13. 2011蓝桥杯--神秘的三位数
  14. ACM-ICPC 2017 Asia Xi'an A XOR (线性基+线段树思想)
  15. C++学习(四六六)Multiple parse contexts are available for this file
  16. SQL Server2012企业版与标准版比较
  17. 【进阶篇】前端学习路线
  18. js中json数组 和 字符串 互转
  19. HtmlEncode是做什么的?
  20. quarkus实战之四:远程热部署

热门文章

  1. 015.西门子PLC与变频器USS通讯演示
  2. 寒冰王座 背包问题之完全背包
  3. PHP: Middleware
  4. MacBook装Windows 10后温度过高/风扇过响的解决办法
  5. 红旗MeeGo中文版平板电脑问世
  6. 【python】美女小姐姐无码壁纸高清下载,诱惑来袭
  7. 3.1-3.31推荐文章汇总
  8. java onmouseover_转 CSS样式里使用JavaScript(onmouseover/onmouseout)
  9. 首师大附中OJ系统 0021 一元一次方程
  10. 锤子员工被变相强制离职,他们要找罗永浩维权