共计 512 个字符,预计需要花费 2 分钟才能阅读完成。
在开发中,我们经常会遇到一个 nil 值不等于 nil,先看一下下面这个例子
type itest struct {a string}
func printA() *itest{return nil}
func main() {var i interface{} = printA()
fmt.Printf("i is nil %v, i = %v", i == nil, i)
}
最后输出结果是 i is nil false, i = <nil>
这是因为 interface 是由两个元素 type:T 和 value: V 所表示。V 是具体值,比如 int, struct, pointer 的具体值。var i interface = 3, i 的 type 是 int,value 是 3。
只有当 type 和 value 都没有设置(T=nil, V 没有赋值)时 interface 才等于 nil。可是在上面例子,i 的 type 是 *itest,所以 i 不是 nil。具体解释可以参考官方 FAQ
解决办法:
func main() {var i = printA()
fmt.Printf("i is nil %v, i = %v", i == nil, i)
}
最后输出结果是 i is nil true, i = <nil>
不将 i 转换成 interface 类型,i 这个时候是 *itest 类型对应的 nil 值。
正文完