nil的奇怪行为

刚接触golang时,发现nil在不同的上下文,行为表现是不同的,并且和其他语言中的表现,也不大相同

实例1:输入true, true, false,不符合传递性

func main() {
var t *T
var i interface{} = t
fmt.Println(t == nil, i == t, i == nil)
}

实例2:nil可以调用方法

func(t *tree) Sum() int {
if t == nil {
return 0
}
return t.v + t.l.Sum() + t.r.Sum()
} var t *tree
t.Sum()

理解nil

golang中的nil与其他语言中的语义是一样的,就是代表引用类型的默认值,但是不一样的是,golang中有多种引用类型:pointer、interface、slice、map,channel, function;因此,每种引用类型的默认值,是不一样的,就和基础类型中,bool的默认值是false, int的默认值是0一样

作为一个强类型语言,不同引用类型的判空(nil)规则是不同的;

  1. interface的判空规则是,需要判断类型和值是否都为nil(interface的底层是有类型和值构成的)

  2. slice的判空,需要判断slice引用底层数组的指针为空,容量和size均为0

因此,判断nil的行为时,需要结合nil指向的具体类型,然后做判断;比如实例1中,t是指针,i是interface, i中的数据类型是*T, 值为nil, 但是因为有类型,所有i不为nil; 实例2中,nil指针能够直接调用方法,也是指针的语言特性

总结

理解nil,不能像理解其他语言中的null一样,统一的去看待,需要结合具体的数据类型,然后改数据类型的语言特性去理解;

历史上,null是一个偷懒的设计,虽然理解上很简单,但是导致了许多问题,现代编程语言针对null,都有着自己的改进,比如java中的optional; nil的特性,也体现了golang开发者对null改进的独特思考,由于没有历史包袱,设计可能比较独特,和其他语言差别较大,初上手时可能比较难理解,但是熟悉后,就能感受到其带来的便捷

参考链接

理解Go语言的nil - 简书

interface{}与nil,违背了==的传递性 - Golang 中国

最新文章

  1. 51nod 1007 正整数分组
  2. 创建odoo数据库时出现错误原因
  3. Timestame类型和String 类型的转化
  4. 让Sqlite脱离VC++ Runtime独立运行
  5. win10快捷键大全 win10常用快捷键
  6. 慢牛APP相关截图
  7. 你会swap吗,按值传递还是按引用?
  8. iPhone/iOS图片相关(读取、保存、绘制、其它相关)
  9. davlik虚拟机内存管理之一——内存分配
  10. Axure母版
  11. GIT 中提示 please tell me who you are
  12. yii [error] [exception.CHttpException.404] exception 'CHttpException' with message 'Unable to resolve the request "favicon.ico".'
  13. BootStrap 智能表单系列 七 验证的支持
  14. 【C#】【SHARE】The registering of global hotkeys
  15. SSH综合练习-仓库管理系统-第二天
  16. [代码]JS原生Ajax,GET和POST
  17. 项目实战4—HAProxy实现高级负载均衡实战和ACL控制
  18. Hbase记录-Hbase配置项
  19. VI编辑器、ipython、jupyter及进程知识总结
  20. asp.net NPOI导出xlsx格式文件,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”

热门文章

  1. vnpy源码阅读学习(9)回到OptionMaster
  2. Spark RDD----pyspark第四次作业
  3. 9个小技巧让你的 if else看起来更优雅
  4. 详解 Discuz 的 PHP经典加密解密函数 authcode
  5. SQLI-LABS学习笔记(一)
  6. RSA,AES加解密算法的实现
  7. python读取txt批量创建文件
  8. 记django从1.11.7升级到2.0.1
  9. 手把手教你用Node.js爬虫爬取网站数据
  10. 由JS数组去重说起