nil interface 和 nil interface 有什么区别 ?
在Go语言中,nil
接口和包含nil
值的接口是两种不同的情况,它们不相等。这是因为接口在Go语言中的内部实现包含两部分:类型信息和值信息。
nil接口:当我们声明一个接口变量但没有赋值时,这个接口就是nil
接口。在这种情况下,接口的类型和值都是nil
。
var i interface{}
fmt.Println(i == nil) // 输出:true
包含nil值的接口:当我们将一个具体类型的nil
值赋给接口变量时,这个接口就包含了nil
值。在这种情况下,接口的类型是具体类型,但值是nil
。
type MyType struct{}
var mt *MyType
var i interface{} = mt
fmt.Println(i == nil) // 输出:false
虽然mt
是nil
,但是当我们将mt
赋值给接口i
时,i
的类型变为了*MyType
,所以i
并不等于nil
。
这个特性常常会导致一些初学者感到困惑,因为他们可能会期望一个包含nil
值的接口等于nil
,但实际上并非如此。