Golang interface(接口)的nil判断

nil在Go语言中只能被赋值给指针和接口。接口在底层的实现有两部分:type和data(参考上一篇博客:https://blog.csdn.net/weixin_42117918/article/details/90372113)。在源码中,显示地将nil赋值给接口时,接口的type和data都将为nil。此时,接口与nil值判断是相等的。但如果将一个带有类型的nil赋值给接口时,只有data为nil,而type不为nil,此时,接口与nil判断将不相等。

代码示例:

package main

import "fmt"

type Student interface {
	ShowInfor()string
}
type stu struct {
	name string
	age int
}
func (s *stu)ShowInfor()string  {
	return "hi"
}
//返回的类型为接口:student
func getStudent()  Student{
	var s *stu=nil  //带有类型的nil(类型为:*stu)
	// 接口实现方法的拥有者(接受者)为:stu(接口实现的方法必须要有拥有者)。可以通过拥有者转换为对应的接口
	//即:stu->Student
	//代码实现:
	// s1:=stu{}
	//var ss Student
	//	ss=&s1
	return s  //返回的接口 只有data为nil,类型不为nil
}
func main() {
	fmt.Println("========显式地将nil赋值给接口==========")
	var ss Student
	ss=nil
	if ss==nil {
		fmt.Println("接收到的信息是:nil")
	}else {
		fmt.Println("接收到的信息是:not nil")
	}
	fmt.Println("========带有类型的nil赋值给接口==========")
	if getStudent()==nil {
		fmt.Println("接收到的信息是:nil")
	}else {
		fmt.Println("接收到的信息是:not nil")
	}

}

可以看出,getStudent()虽然执行:赋值nil操作,但是

getStudent()=!nil。赋值nil操作为对应的data,type并非为nil。

为了避免这类判断的问题,可以在函数返回时,发现带有nil的指针时直接返回nil。

修改之后的代码如下:

func getStudent()  Student{
	var s *stu=nil  //带有类型的nil(类型为:*stu)
	if s==nil { //判断结构体是否为nil
		return nil
	}
	return s  //返回的接口 只有data为nil,类型不为nil()
}

其他代码不变,运行结果如下:

猜你喜欢

转载自blog.csdn.net/weixin_42117918/article/details/90373923
今日推荐