go语言中的nil即空值/零值,含义与java中的null一样,但是用起来是有些坑的。

先来段java代码


interface MyInterface {
}
public class Test implements MyInterface{public static void main(String[] args) {Test test = null;MyInterface myInterface = test;System.out.println(myInterface == null);}
}

运行结果

true

没毛病[Yeah!]

再来段go代码

package mainimport "fmt"type MyInterface interface {}
type Test struct {}func main() {var test *Test = nilvar myInterface MyInterface = testfmt.Println(myInterface == nil)
}

运行结果

false

惊不惊喜?

敲黑板

一、golang中的nil是必须带类型的

nil 在 Go语言中只能被赋值给指针和接口。什么意思?就是以下这种写法是报错的

ptrnil := nil

赋值时接收对象必须要有type(不管是指针还是接口),像这样

var ptrnil *Test = nil
// or
var ptrnil MyInterface = nil

###二、接口的实现也有类型信息

接口在底层的实现有两个部分:type 和 data。在源码中,显式地将 nil 赋值给接口时,接口的 type 和 data 都将为 nil。此时,接口与 nil 值判断是相等的。但如果将一个带有类型的 nil 赋值给接口时,只有 data 为 nil,而 type 不为 nil,此时,接口与 nil 判断将不相等。以开头的代码来说明:

func main() {var test *Test = nil   var myInterface MyInterface = testfmt.Println(myInterface == nil)
}

第2行声明test变量,其值为nil,类型为*Test;

第3行将test赋给myInterface,此时myInterface存的内容是:type=*Test, data=nil

第4行判断== nil, 接口的判断逻辑必须得是type和data都为nil才成功,所以返回false。

只有在以nil直接赋值给接口的时候,接口的type和data才都是nil,nil判断才会返回true:

func main() {var myInterface MyInterface = nil //把test换成nilfmt.Println(myInterface == nil) //打印true
}

这解释了前面的问题。

知道了这个坑写代码的时候需要注意什么?看代码:

package mainimport "fmt"type MyInterface interface {}
type Test struct {}
func getValue()MyInterface {var res *Test//  对res赋值,有可能为iilres = nilreturn res
}func main() {r := getValue()if r != nil {fmt.Println("not nil")} else {fmt.Println("nil")}
}

明明应该是nil,结果打印出来 not nil,这显然是不符合我们预期的。为了避免这种错误,需要在getValue函数中碰到res为nil的时候显式返回nil (注意添加的if判断):

...
func getValue()MyInterface {var res *Test//  对res赋值,有可能为iilres = nilif res == nil {return nil} else {return res}
}

这样结果才是对的。

(完)

Go语言 -- 关于nil的幺蛾子相关推荐

  1. MySQL主从复制以及会出现的幺蛾子问题、解决方法

    目录 引言 一.主从复制原理 1.1.MySQL支持的复制类型 基于语句的复制(STATEMENT) 基于行的复制(ROW) 混合类型的复制(MIXED) 1.2.主从复制的工作过程 1.3.mysq ...

  2. php永久mediaid,幺蛾子事件之-zabbix配置告警媒介报错mediaid重复

    幺蛾子事件之-zabbix配置告警媒介报错mediaid重复 admin • 2020 年 12 月 21 日 直接开篇点题好吧zabbix运行一段时间后,添加报警媒介类型后,添加收件人信息后保存报错 ...

  3. SAP WM 上架策略R的几个幺蛾子

    SAP WM 上架策略R的几个幺蛾子 SAP WM模块中的上架策略R(Dynamic coordinate reference number),项目实践中很少使用.这引起了笔者的好奇,是故打算花点时间 ...

  4. 【软件测试】测试人我明明测了,生产环境还出问题?又出幺蛾子......

    目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...

  5. Python_内置函数之round的幺蛾子

    pycharm运行结果 1 ret = round(0.5) 2 print(ret) >>> 0 3 4 ret1 = round(1.5) 5 print(ret1) >& ...

  6. win10当生产服务器稳定吗,真让人不省心!Win10最稳定版出幺蛾子 微软已证实

    作为Windows 10系统目前最稳定的两个版本,Version 1903/1909更新后也出现了幺蛾子,微软已经证实了. 微软悄然更新了 Windows 10 Version 1903/1909 功 ...

  7. 百度云盘幺蛾子多,我们不用他难道还不行了吗?

    前言 前阵子百度云又出了不少幺蛾子. 先是把 Pandownload(百度云破解器)作者逮进去了: 后是薅用户羊毛,强行占带宽: 百度云盘幺蛾子多,我们不用他难道还不行了吗? 所以今天特意写篇推送告诉 ...

  8. 升级iOS11.2的同学注意了! 刚拯救iPhone无限重启, iPhoneX又出新幺蛾子

    就在昨日许多iPhone用户在更新到iOS11.1.2的系统后,手机多次出现黑屏重启,小编在打电话时也遇到重启的情况.许多网友们也反映在正常使用手机时就开始出现黑屏转动"小菊花". ...

  9. 【go学习笔记】理解Go语言的nil 【转】

    最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频. nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟 ...

最新文章

  1. python怎么读_如何用Python读写文件
  2. cocos2d-x 2.x版本使用uiwidget需要注意的几点
  3. Java基础语法(数组)
  4. cookie文件是存放在服务器端,http - 服务器端cookie和客户端cookie之间有什么区别?...
  5. Dijkstra算法的粗略学习
  6. 如何从Internet Explorer或Edge迁移到Chrome(以及为什么要迁移)
  7. 一段挂起进程中所有线程的代码
  8. gdc服务器维修公司,gdc服务器阵列架坏了
  9. jmeter远程启动命令_Jmeter命令行方式启动
  10. OpenShift 4 之 GitOps(8)用ArgoCD实现的应用迁移、金丝雀部署、DR
  11. 单例设计模式共享数据分析、解决,call_once
  12. mysql数据库导入导出sql文件
  13. Hadoop大数据实战权威指南
  14. 对于高等代数一下比较基础的概念的认识
  15. WinPE 安装系统
  16. linux增强工具安装过程
  17. PC端 kindle 导入 电子书
  18. 使用electron-buil将vue打包成exe并生成安装包
  19. 在线vr高清3d展示线上三维展示平台
  20. [C程序设计]输出所有的“水仙花数”。

热门文章

  1. Tableau性能提升
  2. struct 结构体的内存对齐
  3. Android 通过蓝牙macAdress或者name实现自动连接的一种方法
  4. Opencv做鼠标绘图
  5. 马中赤兔——诺基亚Lumia 920
  6. 通用mapper(mapper-mybatis)
  7. microserver gen10 更换硬盘,解决无法开机问题
  8. python是一种蟒蛇使用的语言_python树莓派系列教程一:初识大蟒蛇 python(python语言环境搭建篇)...
  9. 教师资格证科目二客观题汇总
  10. ABP中服务接口Web.Host部署踩坑