Go 中 Nil 理论上有类型,实践中无类型
译者:baiyutang
原文:https://utcc.utoronto.ca/~cks/space/blog/programming/GoNilIsTypedSortOf
“我”最近在读 Down the Golang nil Rabbit Hole ,中间看到这样的说法:
有一个有趣的事实:Go 有多类型的
nil
,具体来说,有类型和非类型的nil
变量。
你们有些读到这里就去触碰键盘,这也是“我”的第一反应。但是我想,谈论有些人如何最终感觉 nil
有时是无类型更有趣。因为 Go 的 nil
当你把他和其他特性和某些东西必要的接口结合,它会有点模棱两可。所以让我们从 Go 中的 nil
是什么和某些情况下它的行为怎么样开始吧。
代码中,nil
字面能有效工作如果他就像 0
一样是一个无类型的常量(尽管它不是常量,它是贯穿整个规范的具有特殊语义的预先声明标识符)。但是,就像无类型的常量,当你使用 nil
给一个变量赋值或给一个函数传值时,Go 值的结果通常是有类型的。不管他是指针、函数、切片、字典、通道、或某些类型的接口,对于可以为 nil
的具体类型(指针、函数、切片、字段和通道),即使这些 nil
值得类型很容易被观察到。fmt
包的 %T
动词将会报告它。比如,你可以通过 reflect
检查类型。然而,对于接口来说并非如此。
像 Go 中的其他东西一样,接口是有类型的,包括著名的空接口 interface{}
,也是接口的值。值为 nil 的接口扔有类型。但是,这个接口的类型很难被动态观察到,因为 Go 的其他特性:当你转换一个接口类型为其他接口类型,原始接口类型就丢失了。如果一个接口值不是 nil ,它有一个底层的具体类型,这个类型是被隐藏的,当接口类型值被修改为其他接口类型(尽管原始接口的类型丢失了)。但是如果接口值是 nil ,就没有底层类型,并且没有哦其他被隐藏的类型信息。你不能说从 nil 的接口类型到另外 nil 的另外一个接口类型。
版权声明: 本文为 InfoQ 作者【baiyutang】的原创文章。
原文链接:【http://xie.infoq.cn/article/10572ab33214546b4fd3d6779】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论