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

代码示例:

<pre class="has"><code class="language-Go">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") } } </code></pre>

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

<pre><code class="language-html hljs">getStudent()=!nil。赋值nil操作为对应的data,type并非为nil。</code></pre>

<span style="color:#f33b45;">为了避免这类判断的问题,可以在函数返回时,发现带有nil的指针时直接返回nil。</span>

修改之后的代码如下:

<pre class="has"><code class="language-Go">func getStudent() Student{ var s *stu=nil //带有类型的nil(类型为:*stu) if s==nil { //判断结构体是否为nil return nil } return s //返回的接口 只有data为nil,类型不为nil() }</code></pre>

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

https://study.163.com/course/introduction/1210620804.htm

到此这篇关于“Golang interface(接口)的nil判断”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang interface(接口)的nil判断
golang 面试题(十三)interface内部结构和nil详解
Go接口之nil != nil
golang中的nil
Go语言接口interface
golang积累-接口指针与结构体指针
golang 初始化并赋值_Golang | 既是接口又是类型,interface是什么神仙用法?
Go学习--interface(接口)
一看就懂系列之Golang的接口
Golang interface 接口要点梳理