func t(){
var i *int = nil;
var n interface{} = i;
fmt.Println(n==nil); //false
}
可能很多小伙伴都会有疑问都是nil 为啥会不相等。我们先分别看一下pointer,interface的结构体和当pointer,interface为nil时的结构
uintptr
type interfaceStruct struct {
v *_value // 实际值
t *_type // 实际值的类型信息
}
uintptr(0) == nil
type interfaceStruct struct {
v:uintptr(0)
t:uintptr(0)
} == nil
由此我们可以看出nil其实就是指针 interface的零值
这时候我们在来解释为啥为flase就很容易了
func t(){
var i *int = nil; // (*int)nil
var n interface{} = i; // interace{}((*int)nil)
fmt.Println(n==nil); // type interfaceStruct struct {
// v: uintptr(0),
// t: (*int)
// }
}
官方文档规定可以为nil的类型还有 slice ,map ,channel ,function 。
可能有些朋友可能会问为啥没有error类型,那是因为error 只是程序预设的接口方法, err nil 也会出现类似的问题,官方有一个文档也给出了解释,传送门
type error interface {
Error() string
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易采站长站的支持。









