乐趣区

golang-when-is-nil-not-nil

在开发中,我们经常会遇到一个 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 值。

退出移动版