Go语言 -- 关于nil的幺蛾子
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的幺蛾子相关推荐
- MySQL主从复制以及会出现的幺蛾子问题、解决方法
目录 引言 一.主从复制原理 1.1.MySQL支持的复制类型 基于语句的复制(STATEMENT) 基于行的复制(ROW) 混合类型的复制(MIXED) 1.2.主从复制的工作过程 1.3.mysq ...
- php永久mediaid,幺蛾子事件之-zabbix配置告警媒介报错mediaid重复
幺蛾子事件之-zabbix配置告警媒介报错mediaid重复 admin • 2020 年 12 月 21 日 直接开篇点题好吧zabbix运行一段时间后,添加报警媒介类型后,添加收件人信息后保存报错 ...
- SAP WM 上架策略R的几个幺蛾子
SAP WM 上架策略R的几个幺蛾子 SAP WM模块中的上架策略R(Dynamic coordinate reference number),项目实践中很少使用.这引起了笔者的好奇,是故打算花点时间 ...
- 【软件测试】测试人我明明测了,生产环境还出问题?又出幺蛾子......
目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...
- Python_内置函数之round的幺蛾子
pycharm运行结果 1 ret = round(0.5) 2 print(ret) >>> 0 3 4 ret1 = round(1.5) 5 print(ret1) >& ...
- win10当生产服务器稳定吗,真让人不省心!Win10最稳定版出幺蛾子 微软已证实
作为Windows 10系统目前最稳定的两个版本,Version 1903/1909更新后也出现了幺蛾子,微软已经证实了. 微软悄然更新了 Windows 10 Version 1903/1909 功 ...
- 百度云盘幺蛾子多,我们不用他难道还不行了吗?
前言 前阵子百度云又出了不少幺蛾子. 先是把 Pandownload(百度云破解器)作者逮进去了: 后是薅用户羊毛,强行占带宽: 百度云盘幺蛾子多,我们不用他难道还不行了吗? 所以今天特意写篇推送告诉 ...
- 升级iOS11.2的同学注意了! 刚拯救iPhone无限重启, iPhoneX又出新幺蛾子
就在昨日许多iPhone用户在更新到iOS11.1.2的系统后,手机多次出现黑屏重启,小编在打电话时也遇到重启的情况.许多网友们也反映在正常使用手机时就开始出现黑屏转动"小菊花". ...
- 【go学习笔记】理解Go语言的nil 【转】
最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频. nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟 ...
最新文章
- python怎么读_如何用Python读写文件
- cocos2d-x 2.x版本使用uiwidget需要注意的几点
- Java基础语法(数组)
- cookie文件是存放在服务器端,http - 服务器端cookie和客户端cookie之间有什么区别?...
- Dijkstra算法的粗略学习
- 如何从Internet Explorer或Edge迁移到Chrome(以及为什么要迁移)
- 一段挂起进程中所有线程的代码
- gdc服务器维修公司,gdc服务器阵列架坏了
- jmeter远程启动命令_Jmeter命令行方式启动
- OpenShift 4 之 GitOps(8)用ArgoCD实现的应用迁移、金丝雀部署、DR
- 单例设计模式共享数据分析、解决,call_once
- mysql数据库导入导出sql文件
- Hadoop大数据实战权威指南
- 对于高等代数一下比较基础的概念的认识
- WinPE 安装系统
- linux增强工具安装过程
- PC端 kindle 导入 电子书
- 使用electron-buil将vue打包成exe并生成安装包
- 在线vr高清3d展示线上三维展示平台
- [C程序设计]输出所有的“水仙花数”。