教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?

2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?

发布时间:2021-12-09   编辑:jiaochengji.com
教程集为您提供2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?等资源,欢迎您收藏本站,我们将为您提供最新的2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

福哥答案2020-11-10:

reflect.ValueOf(接口变量).IsNil(),用这个即可判断。对于值类型,会panic。两种方法如下:
1.异常判断:recover捕获。
2.类型判断:reflect.ValueOf(接口变量).Kind()获取类型。

golang代码如下:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"reflect"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> Person <span class="token keyword">struct</span> <span class="token punctuation">{</span> Name <span class="token builtin">string</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span><span class="token operator">*</span>Person<span class="token punctuation">)</span> <span class="token function">GetName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> ITester <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">GetName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> i <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token boolean">nil</span> <span class="token comment">//空值</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"空值"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"==判断:"</span><span class="token punctuation">,</span> i <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"异常判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil1</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"类型判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil2</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"-----------"</span><span class="token punctuation">)</span> i <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">int</span><span class="token punctuation">(</span><span class="token boolean">nil</span><span class="token punctuation">)</span> <span class="token comment">//切片</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"切片"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"==判断:"</span><span class="token punctuation">,</span> i <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"异常判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil1</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"类型判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil2</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"-----------"</span><span class="token punctuation">)</span> i <span class="token operator">=</span> <span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span><span class="token function">int</span><span class="token punctuation">(</span><span class="token boolean">nil</span><span class="token punctuation">)</span> <span class="token comment">//映射</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"映射"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"==判断:"</span><span class="token punctuation">,</span> i <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"异常判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil1</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"类型判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil2</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"-----------"</span><span class="token punctuation">)</span> i <span class="token operator">=</span> <span class="token keyword">chan</span> <span class="token function">int</span><span class="token punctuation">(</span><span class="token boolean">nil</span><span class="token punctuation">)</span> <span class="token comment">//通道</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"通道"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"==判断:"</span><span class="token punctuation">,</span> i <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"异常判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil1</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"类型判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil2</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"-----------"</span><span class="token punctuation">)</span> i <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token boolean">nil</span><span class="token punctuation">)</span> <span class="token comment">//函数</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"函数"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"==判断:"</span><span class="token punctuation">,</span> i <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"异常判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil1</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"类型判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil2</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"-----------"</span><span class="token punctuation">)</span> i <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span><span class="token builtin">int</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token boolean">nil</span><span class="token punctuation">)</span> <span class="token comment">//指针</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"指针"</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"==判断:"</span><span class="token punctuation">,</span> i <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"异常判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil1</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"类型判断:"</span><span class="token punctuation">,</span> <span class="token function">InterfaceIsNil2</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">//异常判断</span> <span class="token keyword">func</span> <span class="token function">InterfaceIsNil1</span><span class="token punctuation">(</span>i <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> ret <span class="token operator">:=</span> i <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token keyword">if</span> <span class="token operator">!</span>ret <span class="token punctuation">{</span> <span class="token comment">//需要进一步做判断</span> <span class="token keyword">defer</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">recover</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> ret <span class="token operator">=</span> reflect<span class="token punctuation">.</span><span class="token function">ValueOf</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">IsNil</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//值类型做异常判断,会panic的</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> ret <span class="token punctuation">}</span> <span class="token comment">//类型判断</span> <span class="token keyword">func</span> <span class="token function">InterfaceIsNil2</span><span class="token punctuation">(</span>i <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> ret <span class="token operator">:=</span> i <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token keyword">if</span> <span class="token operator">!</span>ret <span class="token punctuation">{</span> <span class="token comment">//需要进一步做判断</span> vi <span class="token operator">:=</span> reflect<span class="token punctuation">.</span><span class="token function">ValueOf</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span> kind <span class="token operator">:=</span> reflect<span class="token punctuation">.</span><span class="token function">ValueOf</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Kind</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> kind <span class="token operator">==</span> reflect<span class="token punctuation">.</span>Slice <span class="token operator">||</span> kind <span class="token operator">==</span> reflect<span class="token punctuation">.</span>Map <span class="token operator">||</span> kind <span class="token operator">==</span> reflect<span class="token punctuation">.</span>Chan <span class="token operator">||</span> kind <span class="token operator">==</span> reflect<span class="token punctuation">.</span>Interface <span class="token operator">||</span> kind <span class="token operator">==</span> reflect<span class="token punctuation">.</span>Func <span class="token operator">||</span> kind <span class="token operator">==</span> reflect<span class="token punctuation">.</span>Ptr <span class="token punctuation">{</span> <span class="token keyword">return</span> vi<span class="token punctuation">.</span><span class="token function">IsNil</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> ret <span class="token punctuation">}</span> </code></pre>

执行结果如下:

到此这篇关于“2020-11-10:golang中的接口,类型不空,值为空,如何判断是nil?”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

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

[关闭]
~ ~