教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go 语言系列教程(十) : Go的接口及Go中标准接口库,类型断言的使用

Go 语言系列教程(十) : Go的接口及Go中标准接口库,类型断言的使用

发布时间:2021-12-13   编辑:jiaochengji.com
教程集为您提供Go 语言系列教程(十) : Go的接口及Go中标准接口库,类型断言的使用等资源,欢迎您收藏本站,我们将为您提供最新的Go 语言系列教程(十) : Go的接口及Go中标准接口库,类型断言的使用资源
<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><h2>前言</h2> <blockquote> <blockquote>

很多面向对象的语言都有相似的接口概念,但Go语言中接口类型的独特之处在于它是满足隐式实现的,不需要像 java 那样 implements interface 写出来

</blockquote> </blockquote> <h3>
接口的实现和使用</h3> <blockquote> <blockquote>

一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。

</blockquote> </blockquote>

摘录-菜鸟编程

<pre><code class="lang-go hljs"><span class="token comment">/* 定义接口 */</span> <span class="token keyword">type</span> interface_name <span class="token keyword">interface</span> <span class="token punctuation">{</span> method_name1 <span class="token punctuation">[</span>return_type<span class="token punctuation">]</span> method_name2 <span class="token punctuation">[</span>return_type<span class="token punctuation">]</span> method_name3 <span class="token punctuation">[</span>return_type<span class="token punctuation">]</span> <span class="token operator">...</span> method_namen <span class="token punctuation">[</span>return_type<span class="token punctuation">]</span><span class="token punctuation">}</span> <span class="token comment">/* 定义xxx数据结构类型 */</span> <span class="token keyword">type</span> struct_name xxx <span class="token comment">/* 实现接口方法 */</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>struct_name_variable struct_name<span class="token punctuation">)</span> <span class="token function">method_name1</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">[</span>return_type<span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token comment">/* 方法实现 */</span><span class="token punctuation">}</span> <span class="token operator">...</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>struct_name_variable struct_name<span class="token punctuation">)</span> <span class="token function">method_namen</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">[</span>return_type<span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token comment">/* 方法实现*/</span><span class="token punctuation">}</span> </code></pre>

一个案例

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">type</span> Animal <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token punctuation">}</span> <span class="token comment">//定义结构体</span> <span class="token keyword">type</span> Dog <span class="token keyword">struct</span> <span class="token punctuation">{</span> name <span class="token builtin">string</span> age <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>dog Dog<span class="token punctuation">)</span> <span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">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">"Dog's name is"</span><span class="token punctuation">,</span> dog<span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token string">"He cannot fly.Because he is dog,dog cannot fly "</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">""</span> <span class="token punctuation">}</span> <span class="token comment">//实现接口</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>dog Dog<span class="token punctuation">)</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">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">"Dog's name is"</span><span class="token punctuation">,</span> dog<span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token string">"He can run. He is"</span><span class="token punctuation">,</span> dog<span class="token punctuation">.</span>age<span class="token punctuation">,</span> <span class="token string">"岁了"</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">""</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>dog Dog<span class="token punctuation">)</span> <span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">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">"Dog's name is"</span><span class="token punctuation">,</span> dog<span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token string">"He can eat. He is"</span><span class="token punctuation">,</span> dog<span class="token punctuation">.</span>age<span class="token punctuation">,</span> <span class="token string">"岁了"</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">""</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> animal Animal dog <span class="token operator">:=</span> Dog<span class="token punctuation">{</span><span class="token string">"dog"</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">}</span> animal <span class="token operator">=</span> dog animal<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> animal<span class="token punctuation">.</span><span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> animal<span class="token punctuation">.</span><span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

结果

<pre><code class="lang-go hljs">Dog<span class="token string">'s name is dog He can run. He is 12 岁了 Dog'</span>s name is dog He can eat<span class="token punctuation">.</span> He is <span class="token number">12</span> 岁了 Dog's name is dog He cannot fly<span class="token punctuation">.</span>Because he is dog<span class="token punctuation">,</span>dog cannot fly </code></pre> <h3>
接口的多态</h3> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">type</span> Animal <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token punctuation">}</span> <span class="token comment">//定义结构体</span> <span class="token keyword">type</span> Dog <span class="token keyword">struct</span> <span class="token punctuation">{</span> name <span class="token builtin">string</span> age <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token comment">//定义结构体</span> <span class="token keyword">type</span> Bird <span class="token keyword">struct</span> <span class="token punctuation">{</span> name <span class="token builtin">string</span> age <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token comment">//一个以接口为参数的函数</span> <span class="token keyword">func</span> <span class="token function">animalFly</span><span class="token punctuation">(</span>animal Animal<span class="token punctuation">)</span> <span class="token punctuation">{</span> animal<span class="token punctuation">.</span><span class="token function">fly</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 punctuation">(</span>dog Dog<span class="token punctuation">)</span> <span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">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">"Dog's name is"</span><span class="token punctuation">,</span> dog<span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token string">"He cannot fly.Because he is dog,dog cannot fly "</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">""</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>bird Bird<span class="token punctuation">)</span> <span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">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">"Bird's name is"</span><span class="token punctuation">,</span> bird<span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token string">"she can fly.Because he is bird,bird can fly "</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">""</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> dog <span class="token operator">:=</span> Dog<span class="token punctuation">{</span><span class="token string">"dog"</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">}</span> bird <span class="token operator">:=</span> Bird<span class="token punctuation">{</span><span class="token string">"bird"</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">}</span> <span class="token function">animalFly</span><span class="token punctuation">(</span>dog<span class="token punctuation">)</span> <span class="token function">animalFly</span><span class="token punctuation">(</span>bird<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

结果

<pre><code class="lang-go hljs">Dog<span class="token string">'s name is dog He cannot fly.Because he is dog,dog cannot fly Bird'</span>s name is bird she can fly<span class="token punctuation">.</span>Because he is bird<span class="token punctuation">,</span>bird can fly </code></pre> <h3>
接口的嵌入</h3> <blockquote> <blockquote>

Go语言的接口对嵌入支持的非常好,接口可以嵌入其他的接口,效果就像在接口中 直接添加被嵌入接口的方法一样。

</blockquote> </blockquote> <pre><code class="lang-go hljs"><span class="token keyword">type</span> Dog <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Bird <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Animal <span class="token keyword">interface</span> <span class="token punctuation">{</span> Dog Bird <span class="token punctuation">}</span> </code></pre>

以上两个案例并不难,大家看完也就基本明白接口的一般操作了。

<h3>
Go中标准的接口库</h3> <ul><li>fmt.Stringer 接口</li></ul><blockquote> <blockquote>

格式化打印

</blockquote> </blockquote> <pre><code class="lang-go hljs"><span class="token comment">// Stringer is implemented by any value that has a String method,</span> <span class="token comment">// which defines the ``native'' format for that value.</span> <span class="token comment">// The String method is used to print values passed as an operand</span> <span class="token comment">// to any format that accepts a string or to an unformatted printer</span> <span class="token comment">// such as Print.</span> <span class="token keyword">type</span> Stringer <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token punctuation">}</span> </code></pre> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">type</span> Dog <span class="token keyword">struct</span> <span class="token punctuation">{</span> name <span class="token builtin">string</span> age <span class="token builtin">int</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>dog Dog<span class="token punctuation">)</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> fmt<span class="token punctuation">.</span><span class="token function">Sprintf</span><span class="token punctuation">(</span><span class="token string">"%s---%v"</span><span class="token punctuation">,</span>dog<span class="token punctuation">.</span>name<span class="token punctuation">,</span>dog<span class="token punctuation">.</span>age<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> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>Dog<span class="token punctuation">{</span><span class="token string">"dog"</span><span class="token punctuation">,</span><span class="token number">12</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">// dog---12</span> <span class="token punctuation">}</span> </code></pre> <ul><li>sort.Interface 接口</li></ul><blockquote> <blockquote>

Go语言的sort.Sort函数使用了一个接口类型sort.Interface来指定通用的排序算法和可能被排序到的序列类型之间的约定

</blockquote> </blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> sort <span class="token keyword">type</span> Interface <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">Len</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token function">Less</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span>j <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token function">Swap</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> j <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

此案例来自 [go 语言中文网–linkanyway] https://studygolang.com/articles/15235?fr=sidebar

<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">"sort"</span> <span class="token string">"time"</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> Track <span class="token keyword">struct</span> <span class="token punctuation">{</span> Title <span class="token builtin">string</span> Artist <span class="token builtin">string</span> Album <span class="token builtin">string</span> Year <span class="token builtin">int</span> Length time<span class="token punctuation">.</span>Duration <span class="token punctuation">}</span> <span class="token keyword">type</span> Tracks <span class="token punctuation">[</span><span class="token punctuation">]</span>Track <span class="token keyword">func</span> <span class="token function">ParseDurationTime</span><span class="token punctuation">(</span>s <span class="token builtin">string</span><span class="token punctuation">)</span> time<span class="token punctuation">.</span>Duration <span class="token punctuation">{</span> d<span class="token punctuation">,</span> err <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">ParseDuration</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">ParseDurationTime</span><span class="token punctuation">(</span><span class="token string">"0s"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> d <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// {{{ implementation of Sort interface</span> <span class="token comment">// Len is the number of elements in the collection.</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>x Tracks<span class="token punctuation">)</span> <span class="token function">Len</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">len</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// Less reports whether the element with</span> <span class="token comment">// index i should sort before the element with index j.</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>x Tracks<span class="token punctuation">)</span> <span class="token function">Less</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> j <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> x<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>Year <span class="token operator"><</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>Year <span class="token punctuation">}</span> <span class="token comment">// Swap swaps the elements with indexes i and j.</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>x Tracks<span class="token punctuation">)</span> <span class="token function">Swap</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> j <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> x<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token comment">// end implementation of Sort interface }}}</span> <span class="token keyword">var</span> tracks <span class="token operator">=</span> Tracks<span class="token punctuation">{</span> <span class="token punctuation">{</span>Title<span class="token punctuation">:</span> <span class="token string">"C#"</span><span class="token punctuation">,</span> Artist<span class="token punctuation">:</span> <span class="token string">"Delu"</span><span class="token punctuation">,</span> Album<span class="token punctuation">:</span> <span class="token string">"Reading"</span><span class="token punctuation">,</span> Year<span class="token punctuation">:</span> <span class="token number">2017</span><span class="token punctuation">,</span> Length<span class="token punctuation">:</span> <span class="token function">ParseDurationTime</span><span class="token punctuation">(</span><span class="token string">"3m38s"</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>Title<span class="token punctuation">:</span> <span class="token string">"Go"</span><span class="token punctuation">,</span> Artist<span class="token punctuation">:</span> <span class="token string">"Anderson"</span><span class="token punctuation">,</span> Album<span class="token punctuation">:</span> <span class="token string">"Reading"</span><span class="token punctuation">,</span> Year<span class="token punctuation">:</span> <span class="token number">2018</span><span class="token punctuation">,</span> Length<span class="token punctuation">:</span> <span class="token function">ParseDurationTime</span><span class="token punctuation">(</span><span class="token string">"3m38s"</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>Title<span class="token punctuation">:</span> <span class="token string">"Java Bible"</span><span class="token punctuation">,</span> Artist<span class="token punctuation">:</span> <span class="token string">"Js"</span><span class="token punctuation">,</span> Album<span class="token punctuation">:</span> <span class="token string">"Reading"</span><span class="token punctuation">,</span> Year<span class="token punctuation">:</span> <span class="token number">2016</span><span class="token punctuation">,</span> Length<span class="token punctuation">:</span> <span class="token function">ParseDurationTime</span><span class="token punctuation">(</span><span class="token string">"3m38s"</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token comment">//main function</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> sort<span class="token punctuation">.</span><span class="token function">Sort</span><span class="token punctuation">(</span>tracks<span class="token punctuation">)</span> <span class="token keyword">for</span> key<span class="token punctuation">,</span> value <span class="token operator">:=</span> <span class="token keyword">range</span> tracks <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%v:%v \n"</span><span class="token punctuation">,</span> key<span class="token punctuation">,</span> value<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre>

结果

<pre><code class="lang-go hljs"><span class="token number">0</span><span class="token punctuation">:</span><span class="token punctuation">{</span>Java Bible Js Reading <span class="token number">2016</span> <span class="token number">3</span>m38s<span class="token punctuation">}</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">{</span>C# Delu Reading <span class="token number">2017</span> <span class="token number">3</span>m38s<span class="token punctuation">}</span> <span class="token number">2</span><span class="token punctuation">:</span><span class="token punctuation">{</span>Go Anderson Reading <span class="token number">2018</span> <span class="token number">3</span>m38s<span class="token punctuation">}</span> </code></pre> <ul><li>errors.error 接口</li></ul><blockquote> <blockquote>

调用errors.New函数是非常稀少的,因为有一个方便的封装函数fmt.Errorf,它还会处理字符串格式化
创建一个error最简单的方法就是调用errors.New函数,它会根据传入的错误信息返回一个新 的error。整个errors包仅只有4行:

</blockquote> </blockquote> <pre><code class="lang-go hljs"><span class="token keyword">package</span> errors <span class="token comment">// New returns an error that formats as the given text.</span> <span class="token comment">// Each call to New returns a distinct error value even if the text is identical.</span> <span class="token keyword">func</span> <span class="token function">New</span><span class="token punctuation">(</span>text <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator">&</span>errorString<span class="token punctuation">{</span>text<span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// errorString is a trivial implementation of error.</span> <span class="token keyword">type</span> errorString <span class="token keyword">struct</span> <span class="token punctuation">{</span> s <span class="token builtin">string</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>e <span class="token operator">*</span>errorString<span class="token punctuation">)</span> <span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> e<span class="token punctuation">.</span>s <span class="token punctuation">}</span> </code></pre> <h3>
Go中类型断言</h3>

断言类型的语法: x.(T),这里x表示一个接口的类型,T表示一个类型(也可为接口类型)。
有两种可能

<ul><li>第一种,如果断言的类型T是一个具体类型,然后类型断言检查x的动态类 型是否和T相同。如果这个检查成功了,类型断言的结果是x的动态值,当然它的类型是T。换 句话说,具体类型的类型断言从它的操作对象中获得具体的值。如果检查失败,接下来这个 操作会抛出panic。例如:
案例来自 – the go program language</li></ul><pre><code class="lang-go hljs"> <span class="token keyword">var</span> w io<span class="token punctuation">.</span>Writer w <span class="token operator">=</span> os<span class="token punctuation">.</span>Stdout f <span class="token operator">:=</span> w<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>os<span class="token punctuation">.</span>File<span class="token punctuation">)</span> <span class="token comment">// success f == os.Stdout</span> c <span class="token operator">:=</span> w<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token builtin">byte</span><span class="token punctuation">.</span>Buffer<span class="token punctuation">)</span> <span class="token comment">// panic: interface holds *os.File, not *bytes.Buffer</span> </code></pre> <ul><li>第二种,如果断言的类型T是一个接口类型,类型断言x.(T)检查x的动态类型是否满足T接口。如果这个检查成功,则检查结果的接口值的动态类型和动态值不变,但是该接口值的类型被转换为接口类型T。换句话说,对一个接口类型的类型断言改变了类型的表述方式,改变了可以获取的方法集合(通常更大),但是它保护了接口值内部的动态类型和值的部分。
如果检查失败,接下来这个操作会抛出panic,除非用两个变量来接收检查结果,如:f, ok := w.(io.ReadWriter)</li></ul><pre><code class="lang-go hljs"> <span class="token keyword">var</span> w io<span class="token punctuation">.</span>Writer w <span class="token operator">=</span> os<span class="token punctuation">.</span>Stdout rw <span class="token operator">:=</span> w<span class="token punctuation">.</span><span class="token punctuation">(</span>io<span class="token punctuation">.</span>ReadWriter<span class="token punctuation">)</span> <span class="token comment">// success: *os.File has both Read and Write</span> w <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>ByteCounter<span class="token punctuation">)</span> rw <span class="token operator">=</span> w<span class="token punctuation">.</span><span class="token punctuation">(</span>io<span class="token punctuation">.</span>ReadWriter<span class="token punctuation">)</span> <span class="token comment">// panic: *ByteCounter has no Read method</span> </code></pre>

Tip:如果断言的操作对象x是一个nil接口值,那么不论被断言的类型T是什么这个类型断言都会失败。

<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 punctuation">)</span> <span class="token comment">//===接口=====</span> <span class="token keyword">type</span> Tester <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 builtin">string</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Tester2 <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">printName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">//===Person类型====</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>p 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 builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> p<span class="token punctuation">.</span>name <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p Person<span class="token punctuation">)</span> <span class="token function">printName</span><span class="token punctuation">(</span><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>p<span class="token punctuation">.</span>name<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">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> t Tester t <span class="token operator">=</span> Person<span class="token punctuation">{</span><span class="token string">"xiaohua"</span><span class="token punctuation">}</span> <span class="token function">check</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">check</span><span class="token punctuation">(</span>t Tester<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//第一种情况</span> <span class="token keyword">if</span> f<span class="token punctuation">,</span> ok1 <span class="token operator">:=</span> t<span class="token punctuation">.</span><span class="token punctuation">(</span>Person<span class="token punctuation">)</span><span class="token punctuation">;</span> ok1 <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"%T %s\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">,</span> f<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 comment">//第二种情况</span> <span class="token keyword">if</span> t<span class="token punctuation">,</span> ok2 <span class="token operator">:=</span> t<span class="token punctuation">.</span><span class="token punctuation">(</span>Tester2<span class="token punctuation">)</span><span class="token punctuation">;</span> ok2 <span class="token punctuation">{</span> <span class="token comment">//重用变量名t(无需重新声明)</span> <span class="token function">check2</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span> <span class="token comment">//若类型断言为true,则新的t被转型为Tester2接口类型,但其动态类型和动态值不变</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">check2</span><span class="token punctuation">(</span>t Tester2<span class="token punctuation">)</span> <span class="token punctuation">{</span> t<span class="token punctuation">.</span><span class="token function">printName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

结果

<pre><code class="lang-go hljs">main<span class="token punctuation">.</span>Person xiaohua xiaohua </code></pre>

----电视上那些甩门而去的不锁门是因为他们基本上回不来,所以我从不看电视剧,光看台词我都能猜着谁在第几集死。

到此这篇关于“Go 语言系列教程(十) : Go的接口及Go中标准接口库,类型断言的使用”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想系统学习GO语言(Golang
go run main.go 参数_Go语言入门:Hello world
Go 语言到底适合干什么?
Go语言发展历史、核心、特性及学习路线
兄弟连golang神技(1)-关于 Go 语言的介绍
基于类型系统的面向对象编程语言Go
Go 语言十年而立,Go2 蓄势待发
为何要用go语言
Go语言爱好者周刊:第 78 期 — 这道关于 goroutine 的题
Go语言的主要特性和发展影响

[关闭]
~ ~