nil slice作为接口传递时不是零!为什么? (golang)
发布时间:2020-12-16 19:19:35 所属栏目:大数据 来源:网络整理
导读:看到这个游乐场: http://play.golang.org/p/nWHmlw1W01 package mainimport "fmt"func main() { var i []int = nil yes(i) // output: true no(i) // output: false}func yes(thing []int) { fmt.Println(thing == nil)}func no(thing interface{}) { fmt.P
看到这个游乐场:
http://play.golang.org/p/nWHmlw1W01
package main import "fmt" func main() { var i []int = nil yes(i) // output: true no(i) // output: false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) } 为什么两个函数之间的输出差异?
不可否认,这有些怪癖,但有一个解释.
想象一个interface {}变量作为由两个字段组成的结构:一个是类型,另一个是数据. ([] int和nil).实际上,它在Go运行时看起来就像那样. struct Iface { Itab* tab; void* data; }; 当你将nil切片传递给yes时,只有nil作为值传递,所以你的比较可以归结为nil == nil. 同时,调用no会自动将变量包装在interface {}类型中,并且调用变为类似于no(interface {[] int,nil}).所以no中的比较可以看作是接口{[] int,nil} == nil,在go中结果是假的. 这个问题实际上是在the Go FAQ中解释的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |