教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 GO语言使用之面向对象编程(7)接口

GO语言使用之面向对象编程(7)接口

发布时间:2022-03-06   编辑:jiaochengji.com
教程集为您提供GO语言使用之面向对象编程(7)接口等资源,欢迎您收藏本站,我们将为您提供最新的GO语言使用之面向对象编程(7)接口资源
<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 id="一为什么需要接口">一、为什么需要接口</h2>

在Golang中 多态特性主要是通过接口来体现的。

<h2 id="二基本介绍">二、基本介绍</h2>

interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。到某个自定义类型(比如结构体Phone)要使用的时候,在根据具体情况把这些方法写出来(实现)。

<h2 id="三基本语法">三、基本语法</h2> <pre class="prettyprint"><code class=" hljs haskell"><span class="hljs-typedef"><span class="hljs-keyword">type</span> 接口名 interface<span class="hljs-container">{ <span class="hljs-title">method1</span>(参数列表) 返回值列表 <span class="hljs-title">method2</span>(参数列表) 返回值列表 … }</span></span> </code></pre>

实现接口所有方法:

<pre class="prettyprint"><code class=" hljs scss">func (t 自定义类型) <span class="hljs-function">method1(参数列表)</span> 返回值列表 { <span class="hljs-comment">//方法实现</span> } func (t 自定义类型) <span class="hljs-function">method2(参数列表)</span> 返回值列表 { <span class="hljs-comment">//方法实现</span> } <span class="hljs-comment">//.... </span> </code></pre>

说明:
1) 接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低偶合的思想。
2) Golang中的接口,不需要显式的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,Golang中没有implement这样的关键字

<h2 id="四快速入门案例">四、快速入门案例</h2> <pre class="prettyprint"><code class=" hljs go"><span class="hljs-keyword">type</span> camputer <span class="hljs-keyword">struct</span>{ } <span class="hljs-keyword">type</span> phone <span class="hljs-keyword">struct</span>{ name <span class="hljs-typename">string</span> price <span class="hljs-typename">float64</span> } <span class="hljs-keyword">type</span> camera <span class="hljs-keyword">struct</span>{ name <span class="hljs-typename">string</span> price <span class="hljs-typename">float64</span> } <span class="hljs-keyword">type</span> Usb <span class="hljs-keyword">interface</span> { charging() boot() shutdown() } <span class="hljs-comment">//实现接口</span> <span class="hljs-keyword">func</span> (p phone) charging(){ fmt.Printf(<span class="hljs-string">"%s手机开始充电。。。。\n"</span>,p.name) } <span class="hljs-keyword">func</span> (p phone) boot(){ fmt.Printf(<span class="hljs-string">"%s手机正在开机。。。。\n"</span>,p.name) } <span class="hljs-keyword">func</span> (p phone) shutdown(){ fmt.Printf(<span class="hljs-string">"%s手机关机了。。。。\n"</span>,p.name) } <span class="hljs-keyword">func</span> (c camera) charging(){ fmt.Printf(<span class="hljs-string">"%s相机开始充电。。。。\n"</span>,c.name) } <span class="hljs-keyword">func</span> (c camera) boot(){ fmt.Printf(<span class="hljs-string">"%s相机正在开机。。。。\n"</span>,c.name) } <span class="hljs-keyword">func</span> (c camera) shutdown(){ fmt.Printf(<span class="hljs-string">"%s相机关机了。。。。\n"</span>,c.name) } <span class="hljs-keyword">func</span> (c camputer) working(usb Usb) { usb.boot() usb.shutdown() usb.charging() } <span class="hljs-keyword">func</span> InterfaceDemo() { p := phone{<span class="hljs-string">"小米"</span><span class="hljs-number">,6000</span>} c := camera{<span class="hljs-string">"尼康"</span><span class="hljs-number">,20000</span>} <span class="hljs-built_in">cap</span> := camputer{} <span class="hljs-built_in">cap</span>.working(p) <span class="hljs-built_in">cap</span>.working(c) }</code></pre> <h2 id="五使用细节和注意事项">五、使用细节和注意事项</h2>

1、 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)

<pre class="prettyprint"><code class=" hljs go"><span class="hljs-keyword">type</span> student <span class="hljs-keyword">struct</span>{} <span class="hljs-keyword">type</span> action <span class="hljs-keyword">interface</span>{ sport() } <span class="hljs-keyword">func</span> (s student) sport() { } <span class="hljs-comment">// 1、接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)</span> <span class="hljs-keyword">func</span> DetailsDemo1(){ <span class="hljs-keyword">var</span> a action fmt.Println(<span class="hljs-string">"a="</span>,a) <span class="hljs-keyword">var</span> s student a=s fmt.Println(<span class="hljs-string">"s="</span>,s) }</code></pre>

2、接口中所有的方法都没有方法体,即都是没有实现的方法。
3、 在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。

<pre class="prettyprint"><code class=" hljs go"><span class="hljs-comment">// 3、在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。</span> <span class="hljs-keyword">type</span> student1 <span class="hljs-keyword">struct</span>{} <span class="hljs-keyword">type</span> action1 <span class="hljs-keyword">interface</span>{ <span class="hljs-comment">// a int</span> sport() draw() } <span class="hljs-keyword">func</span> (s student1) sport() { } <span class="hljs-keyword">func</span> DetailsDemo2(){ <span class="hljs-keyword">var</span> a action1 fmt.Println(<span class="hljs-string">"a="</span>,a) <span class="hljs-keyword">var</span> s student1 <span class="hljs-comment">// 如果没有将接口的所有方法实现,会出现恐慌</span> <span class="hljs-comment">// a=s</span> fmt.Println(<span class="hljs-string">"s="</span>,s) }</code></pre>

4、 一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。

<pre class="prettyprint"><code class=" hljs go"><span class="hljs-comment">// 4、一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。 </span> <span class="hljs-keyword">func</span> DetailsDemo3(){ <span class="hljs-keyword">var</span> a action1 fmt.Println(<span class="hljs-string">"a="</span>,a) <span class="hljs-keyword">var</span> s student <span class="hljs-comment">// a=s //stuent没有实现action1下方法,会出现恐慌</span> fmt.Println(<span class="hljs-string">"s="</span>,s) }</code></pre>

5、只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。

<pre class="prettyprint"><code class=" hljs livecodeserver">// <span class="hljs-number">5</span>、只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。 type <span class="hljs-keyword">integer</span> int func (i <span class="hljs-keyword">integer</span>) sport() { } func DetailsDemo4(){ var <span class="hljs-operator">a</span> action fmt.Println(<span class="hljs-string">"a="</span>,<span class="hljs-operator">a</span>) var i <span class="hljs-keyword">integer</span> <span class="hljs-operator">a</span>=i fmt.Println(<span class="hljs-string">"a="</span>,<span class="hljs-operator">a</span>) }</code></pre>

6、 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
7、 接口中所有的方法都没有方法体,即都是没有实现的方法。

<pre class="prettyprint"><code class=" hljs fsharp"><span class="hljs-comment">// 7、Golang接口中不能有任何变量</span> <span class="hljs-class"><span class="hljs-keyword">type</span> <span class="hljs-title">action2</span> <span class="hljs-title">interface</span>{</span> sport() <span class="hljs-comment">// age integer</span> }</code></pre>

8、 一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现。

<pre class="prettyprint"><code class=" hljs go"><span class="hljs-comment">// 8、一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现。</span> <span class="hljs-keyword">type</span> AInter <span class="hljs-keyword">interface</span> { sayOk1() } <span class="hljs-keyword">type</span> BInter <span class="hljs-keyword">interface</span> { sayOk2() <span class="hljs-comment">// sayOk1() //继承多个接口时,每个接口的方法不能重复</span> } <span class="hljs-keyword">type</span> CInter <span class="hljs-keyword">interface</span> { AInter BInter sayOk3() } <span class="hljs-keyword">type</span> Monster <span class="hljs-keyword">struct</span> { } <span class="hljs-comment">//让Monster 实现 CInter</span> <span class="hljs-keyword">func</span> (m Monster) sayOk1() { fmt.Println(<span class="hljs-string">"sayOk1()"</span>) } <span class="hljs-keyword">func</span> (m Monster) sayOk2() { fmt.Println(<span class="hljs-string">"sayOk2()"</span>) } <span class="hljs-keyword">func</span> (m Monster) sayOk3() { fmt.Println(<span class="hljs-string">"sayOk3()"</span>) } <span class="hljs-keyword">func</span> DetailsDemo6(){ <span class="hljs-keyword">var</span> monster Monster <span class="hljs-keyword">var</span> c CInter c = monster fmt.Println(<span class="hljs-string">"c="</span>, c) <span class="hljs-keyword">var</span> bInter BInter bInter = monster fmt.Println(<span class="hljs-string">"bInter="</span>, bInter) }</code></pre>

9、 一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。

10、 只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。
11、 interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil

<pre class="prettyprint"><code class=" hljs go"><span class="hljs-comment">// 9、interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil </span> <span class="hljs-keyword">func</span> DetailsDemo7(){ <span class="hljs-keyword">var</span> c CInter fmt.Println(<span class="hljs-string">"c="</span>, c) }</code></pre>

12、 空接口interface{} 没有任何方法,所以所有类型都实现了空接口【案例演示】

<pre class="prettyprint"><code class=" hljs php"><span class="hljs-comment">// 10、空接口interface{} 没有任何方法,所以所有类型都实现了空接口</span> func DetailsDemo8(){ <span class="hljs-keyword">var</span> m <span class="hljs-class"><span class="hljs-keyword">interface</span> {</span>} num1 := <span class="hljs-number">10</span> num2 := <span class="hljs-number">12.00</span> num3 := <span class="hljs-keyword">true</span> num4 := <span class="hljs-string">"sjdskj"</span> <span class="hljs-comment">//空接口interface{}可以接受任何类型</span> m = num1 fmt.Println(m) m = num2 fmt.Println(m) m = num3 fmt.Println(m) m = num4 fmt.Println(m) }</code></pre>

完整代码如下:

<pre class="prettyprint"><code class=" hljs go"><span class="hljs-keyword">package</span> utils <span class="hljs-keyword">import</span> ( <span class="hljs-string">"fmt"</span> ) <span class="hljs-keyword">type</span> student <span class="hljs-keyword">struct</span>{} <span class="hljs-keyword">type</span> action <span class="hljs-keyword">interface</span>{ sport() } <span class="hljs-keyword">func</span> (s student) sport() { } <span class="hljs-comment">// 1、接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)</span> <span class="hljs-keyword">func</span> DetailsDemo1(){ <span class="hljs-keyword">var</span> a action fmt.Println(<span class="hljs-string">"a="</span>,a) <span class="hljs-keyword">var</span> s student a=s fmt.Println(<span class="hljs-string">"s="</span>,s) } <span class="hljs-comment">// 2、接口中所有的方法都没有方法体,即都是没有实现的方法。</span> <span class="hljs-comment">// 3、在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。</span> <span class="hljs-keyword">type</span> student1 <span class="hljs-keyword">struct</span>{} <span class="hljs-keyword">type</span> action1 <span class="hljs-keyword">interface</span>{ <span class="hljs-comment">// a int</span> sport() draw() } <span class="hljs-keyword">func</span> (s student1) sport() { } <span class="hljs-keyword">func</span> DetailsDemo2(){ <span class="hljs-keyword">var</span> a action1 fmt.Println(<span class="hljs-string">"a="</span>,a) <span class="hljs-keyword">var</span> s student1 <span class="hljs-comment">// 如果没有将接口的所有方法实现,会出现恐慌</span> <span class="hljs-comment">// a=s</span> fmt.Println(<span class="hljs-string">"s="</span>,s) } <span class="hljs-comment">// 4、一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。 </span> <span class="hljs-keyword">func</span> DetailsDemo3(){ <span class="hljs-keyword">var</span> a action1 fmt.Println(<span class="hljs-string">"a="</span>,a) <span class="hljs-keyword">var</span> s student <span class="hljs-comment">// a=s //stuent没有实现action1下方法,会出现恐慌</span> fmt.Println(<span class="hljs-string">"s="</span>,s) } <span class="hljs-comment">// 5、只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。</span> <span class="hljs-keyword">type</span> integer <span class="hljs-typename">int</span> <span class="hljs-keyword">func</span> (i integer) sport() { } <span class="hljs-keyword">func</span> DetailsDemo4(){ <span class="hljs-keyword">var</span> a action fmt.Println(<span class="hljs-string">"a="</span>,a) <span class="hljs-keyword">var</span> i integer a=i fmt.Println(<span class="hljs-string">"a="</span>,a) } <span class="hljs-comment">// 6、一个自定义类型可以实现多个接口 </span> <span class="hljs-keyword">func</span> DetailsDemo5(){} <span class="hljs-comment">// 7、Golang接口中不能有任何变量</span> <span class="hljs-keyword">type</span> action2 <span class="hljs-keyword">interface</span>{ sport() <span class="hljs-comment">// age integer</span> } <span class="hljs-comment">// 8、一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现。</span> <span class="hljs-keyword">type</span> AInter <span class="hljs-keyword">interface</span> { sayOk1() } <span class="hljs-keyword">type</span> BInter <span class="hljs-keyword">interface</span> { sayOk2() <span class="hljs-comment">// sayOk1() //继承多个接口时,每个接口的方法不能重复</span> } <span class="hljs-keyword">type</span> CInter <span class="hljs-keyword">interface</span> { AInter BInter sayOk3() } <span class="hljs-keyword">type</span> Monster <span class="hljs-keyword">struct</span> { } <span class="hljs-comment">//让Monster 实现 CInter</span> <span class="hljs-keyword">func</span> (m Monster) sayOk1() { fmt.Println(<span class="hljs-string">"sayOk1()"</span>) } <span class="hljs-keyword">func</span> (m Monster) sayOk2() { fmt.Println(<span class="hljs-string">"sayOk2()"</span>) } <span class="hljs-keyword">func</span> (m Monster) sayOk3() { fmt.Println(<span class="hljs-string">"sayOk3()"</span>) } <span class="hljs-keyword">func</span> DetailsDemo6(){ <span class="hljs-keyword">var</span> monster Monster <span class="hljs-keyword">var</span> c CInter c = monster fmt.Println(<span class="hljs-string">"c="</span>, c) <span class="hljs-keyword">var</span> bInter BInter bInter = monster fmt.Println(<span class="hljs-string">"bInter="</span>, bInter) } <span class="hljs-comment">// 9、interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil </span> <span class="hljs-keyword">func</span> DetailsDemo7(){ <span class="hljs-keyword">var</span> c CInter fmt.Println(<span class="hljs-string">"c="</span>, c) } <span class="hljs-comment">// 10、空接口interface{} 没有任何方法,所以所有类型都实现了空接口</span> <span class="hljs-keyword">func</span> DetailsDemo8(){ <span class="hljs-keyword">var</span> m <span class="hljs-keyword">interface</span> {} num1 :=<span class="hljs-number"> 10</span> num2 :=<span class="hljs-number"> 12.00</span> num3 := <span class="hljs-constant">true</span> num4 := <span class="hljs-string">"sjdskj"</span> <span class="hljs-comment">//空接口interface{}可以接受任何类型</span> m = num1 fmt.Println(m) m = num2 fmt.Println(m) m = num3 fmt.Println(m) m = num4 fmt.Println(m) }</code></pre> <h2 id="六接口最佳实践">六、接口最佳实践</h2>

实现对Hero结构体切片的排序: sort.Sort(data Interface)

<pre class="prettyprint"><code class=" hljs go"><span class="hljs-comment">/* 实现对Hero结构体切片的排序: sort.Sort(data Interface) 根据age大小排序 分析 实现原理 sort.Sort(data Interface) 1、定义结构体 heros,并添加字段 name age 2、自定义 heros切片类型 HeroSlice 3、HeroSlice实现len方法,确定切片长度 4、HeroSlice实现less方法,确定切片排序顺序 5、HeroSlice实现swap方法,进行数据交换操作 6、调用。 */</span> <span class="hljs-keyword">type</span> heros <span class="hljs-keyword">struct</span>{ name <span class="hljs-typename">string</span> age <span class="hljs-typename">int</span> } <span class="hljs-keyword">type</span> HeroSlice []heros <span class="hljs-keyword">func</span> (h HeroSlice)Len() <span class="hljs-typename">int</span> { <span class="hljs-keyword">return</span> <span class="hljs-built_in">len</span>(h) } <span class="hljs-keyword">func</span> (h HeroSlice)Less(i,j <span class="hljs-typename">int</span>) <span class="hljs-typename">bool</span> { <span class="hljs-keyword">return</span> h[i].age < h[j].age } <span class="hljs-keyword">func</span> (h HeroSlice)Swap(i,j <span class="hljs-typename">int</span>) { <span class="hljs-comment">//传统写法</span> t := h[i] h[i] = h[j] h[j] = t <span class="hljs-comment">//还有一个简洁的写法</span> <span class="hljs-comment">//hs[i], hs[j] = hs[j], hs[i]</span> } <span class="hljs-keyword">func</span> SortDemo(){ <span class="hljs-keyword">var</span> heroSlice HeroSlice <span class="hljs-keyword">for</span> i :=<span class="hljs-number"> 0</span>; i <<span class="hljs-number"> 10</span>; i { hero := heros{ name : fmt.Sprintf(<span class="hljs-string">"梁山英雄%d"</span>,rand.Intn<span class="hljs-number">(100</span>)), age : rand.Intn<span class="hljs-number">(100</span>), } heroSlice = <span class="hljs-built_in">append</span>(heroSlice,hero) } fmt.Println(<span class="hljs-string">"heroSlice"</span>,heroSlice) sort.Sort(heroSlice) fmt.Println(<span class="hljs-string">"heroSlice"</span>,heroSlice) }</code></pre> 到此这篇关于“GO语言使用之面向对象编程(7)接口”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
go 获取函数地址_Go语言基础--接口浅析
兄弟连golang神技(1)-关于 Go 语言的介绍
Go 语言到底适合干什么?
Go语言学习3----Go语言特色
Go语言发展历史、核心、特性及学习路线
关于Golang的介绍
基于类型系统的面向对象编程语言Go
go语言和python哪个难
golang和python有什么区别?
Go语言的主要特性和发展影响

[关闭]
~ ~