Go语言中 多态的理解和实现细节 (Golang经典编程案例)
多态:接口的多种不同的事项方式
在Golang中,多态以接口实现,可以按照统一的接口来调用不同的实现,这时接口变量就呈现多种不同的形态。
接口体现多态有两种表现方式:
<ol><li>多态参数;</li><li>多态数组。</li></ol>
下面以一个案例详细演示多态:
<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 comment">//声明一个接口</span> <span class="token keyword">type</span> Usb <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token comment">//声明两个没有实现的方法</span> <span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Phone <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 comment">//让Phone实现Usb接口的方法</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p Phone<span class="token punctuation">)</span> <span class="token function">Start</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><span class="token string">"手机开始工作..."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p Phone<span class="token punctuation">)</span> <span class="token function">Stop</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><span class="token string">"手机停止工作..."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">type</span> Camera <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>c Camera<span class="token punctuation">)</span> <span class="token function">Start</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><span class="token string">"相机开始工作..."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>c Camera<span class="token punctuation">)</span> <span class="token function">Stop</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><span class="token string">"相机停止工作..."</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 comment">//定义一个Usb接口数组,可以存放Phone和Canera的结构体变量</span> <span class="token comment">//这里就体现出多态数组</span> <span class="token keyword">var</span> usbArr <span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span>Usb usbArr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> Phone<span class="token punctuation">{</span><span class="token string">"小米"</span><span class="token punctuation">}</span> usbArr<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> Phone<span class="token punctuation">{</span><span class="token string">"vivo"</span><span class="token punctuation">}</span> usbArr<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> Camera<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>usbArr<span class="token punctuation">)</span> test <span class="token operator">:=</span> Phone<span class="token punctuation">{</span><span class="token punctuation">}</span> test<span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"小米"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>test<span class="token punctuation">.</span>name<span class="token punctuation">)</span> test<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> test<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> test1 <span class="token operator">:=</span> Camera<span class="token punctuation">{</span><span class="token punctuation">}</span> test1<span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"索尼相机"</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>test1<span class="token punctuation">.</span>name<span class="token punctuation">)</span> test1<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> test1<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>执行结果如下图所示:
您可能感兴趣的文章:
想系统学习GO语言(Golang
go run main.go 参数_Go语言入门:Hello world
Go 语言到底适合干什么?
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
golang url 收集
Go 语言十年而立,Go2 蓄势待发
兄弟连golang神技(1)-关于 Go 语言的介绍
go语言和python哪个难
golang和python有什么区别?
Go 开发关键技术指南 | 为什么你要选择 Go?(内含超全知识大图)