写点什么

Go 中 Nil 理论上有类型,实践中无类型

用户头像
baiyutang
关注
发布于: 刚刚
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 的另外一个接口类型。


发布于: 刚刚阅读数: 3
用户头像

baiyutang

关注

广州 2017.12.13 加入

Microservices | Golang | Cloud Nitive | “Smart work,Not hard”

评论

发布
暂无评论
Go 中 Nil 理论上有类型,实践中无类型