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

虽然mtnil,但是当我们将mt赋值给接口i时,i的类型变为了*MyType,所以i并不等于nil

这个特性常常会导致一些初学者感到困惑,因为他们可能会期望一个包含nil值的接口等于nil,但实际上并非如此。

发表评论

后才能评论