类型断言</h1>
一个接口类型的变量中可能包含着不同实际类型的值(实现接口的可以有不同的类型),当我们需要判断接口变量中的实际类型时,可以使用类型断言来检测
假设<code>i</code>是一个接口变量,<code>T</code>是某个具体实现该接口的类型,那么可以使用下面的语句来检测<code>i</code>是否为类型<code>T</code>:
<pre><code class="lang-go hljs">s<span class="token punctuation">,</span> ok <span class="token operator">:=</span> i<span class="token punctuation">.</span><span class="token punctuation">(</span>T<span class="token punctuation">)</span>
</code></pre>
当接口变量<code>i</code>的实际类型是<code>T</code>时,<code>s</code>是<code>i</code>转换到类型<code>T</code>的值,<code>ok</code>的值是<code>true</code>;当接口变量<code>i</code>的实际类型不是<code>T</code>时,<code>s</code>是类型<code>T</code>的零值,<code>ok</code>是<code>false</code>。下面是一段检测接口类型的实例:
<pre><code class="lang-go hljs"><span class="token keyword">type</span> Shaper <span class="token keyword">interface</span> <span class="token punctuation">{</span>
<span class="token function">Area</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">float64</span>
<span class="token function">Perimeter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">float64</span>
<span class="token punctuation">}</span>
<span class="token keyword">type</span> Square <span class="token keyword">struct</span> <span class="token punctuation">{</span>
side <span class="token builtin">float64</span>
<span class="token punctuation">}</span>
<span class="token comment">//计算面积</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>sq Square<span class="token punctuation">)</span> <span class="token function">Area</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">float64</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> sq<span class="token punctuation">.</span>side <span class="token operator">*</span> sq<span class="token punctuation">.</span>side
<span class="token punctuation">}</span>
<span class="token comment">//计算周长</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>sq Square<span class="token punctuation">)</span> <span class="token function">Perimeter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">float64</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> sq<span class="token punctuation">.</span>side <span class="token operator">*</span> <span class="token number">4</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>
sq <span class="token operator">:=</span> Square<span class="token punctuation">{</span>
side<span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span>
<span class="token function">isShape</span><span class="token punctuation">(</span>sq<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">isShape</span><span class="token punctuation">(</span>s Shaper<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> sp<span class="token punctuation">,</span> ok <span class="token operator">:=</span> s<span class="token punctuation">.</span><span class="token punctuation">(</span>Square<span class="token punctuation">)</span><span class="token punctuation">;</span> ok <span class="token punctuation">{</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>sp<span class="token punctuation">,</span> <span class="token string">"is a shaper"</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span> <span class="token keyword">else</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">"none"</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
接口变量的类型也可以用一种<code>type-switch</code>的形式去检测:
<pre><code class="lang-go hljs"><span class="token keyword">type</span> Shaper <span class="token keyword">interface</span> <span class="token punctuation">{</span>
<span class="token function">Area</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">float64</span>
<span class="token function">Perimeter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">float64</span>
<span class="token punctuation">}</span>
<span class="token keyword">type</span> Square <span class="token keyword">struct</span> <span class="token punctuation">{</span>
side <span class="token builtin">float64</span>
<span class="token punctuation">}</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>sq Square<span class="token punctuation">)</span> <span class="token function">Area</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">float64</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> sq<span class="token punctuation">.</span>side <span class="token operator">*</span> sq<span class="token punctuation">.</span>side
<span class="token punctuation">}</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>sq Square<span class="token punctuation">)</span> <span class="token function">Perimeter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">float64</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> sq<span class="token punctuation">.</span>side <span class="token operator">*</span> <span class="token number">4</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>
sq <span class="token operator">:=</span> Square<span class="token punctuation">{</span>
side<span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span>
<span class="token function">whatType</span><span class="token punctuation">(</span>sq<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token keyword">func</span> <span class="token function">whatType</span><span class="token punctuation">(</span>s <span class="token keyword">interface</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">switch</span> v <span class="token operator">:=</span> s<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token keyword">type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">case</span> Square<span class="token punctuation">:</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>v<span class="token punctuation">,</span> <span class="token string">"is a square"</span><span class="token punctuation">)</span>
<span class="token keyword">case</span> <span class="token builtin">int</span><span class="token punctuation">:</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>v<span class="token punctuation">,</span> <span class="token string">"is a square"</span><span class="token punctuation">)</span>
<span class="token keyword">default</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">"none"</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
在函数<code>whatType</code>中,对接口变量的类型进行检测,函数传入的是一个空接口类型的参数,<code>v = s.(type)</code>得到变量<code>s</code>的具体类型,然后对<code>case</code>中列举的类型进行匹配,如果被检测的类型没有在<code>case</code>语句列举的类型中,就会执行<code>default</code>语句。但注意<code>type-switch</code>中不允许使用<code>fallthrough</code>
<blockquote class="layui-elem-quote" style="width: 100%;overflow:hidden">
作者: xah100147
链接: https://blog.csdn.net/xah100147/article/details/106420743
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
</blockquote>
到此这篇关于“Go学习笔记(13)Go接口”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
想系统学习GO语言(Golang
Golang笔记:语法,并发思想,web开发,Go微服务相关
go语言学习笔记(十三)——接口类型
go语言学习笔记(第3章)—面向对象编程
Golang学习笔记(五):Go语言与C语言的区别
2018年最全Go语言教程零基础入门到进阶实战视频
Go学习笔记:接口实现与指针
go run main.go 参数_Go语言入门:Hello world
Sublime Text 3配置Go语言开发环境
go 语言学习历程