教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go中实现接口的几种方式

go中实现接口的几种方式

发布时间:2022-02-11   编辑:jiaochengji.com
教程集为您提供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><h1>go中实现接口的几种方式</h1> <pre><code> //定义1个接口student,它包含1个 StudentName 方法 type student interface { StudentName() string } //定义1个结构体 type Boy struct { Name string } //给他这个结构体绑定一个方法 StudentName。这样就表示它实现了 student接口 func (a Boy) StudentName() string { return a.Name } </code></pre>

上面是常见的接口申请以及定义1个结构体,然后绑定接口里相同的方法名,这样用以实现接口实现。

值得注意的是,我们定义了1个接口A,里面有个空方法F。然后我们用结构体B绑定方法的方式重写实现了这个空方法F,也就间接的实现了这个接口。一般我们调用的是时候,会直接用原始的接口A的实例去调用这个方法F,而不是这个结构体B的实例去调用F。

理解这一点很重要。

<h2>
1. 用常规等于实现</h2>

我们看下常规是怎么实现的:

<pre><code>//1. 首先,实例化这个结构体 var b1 = Boy{"zhangsan",} //2. 再实例化一下interface var s1 student //3. 将 b1 赋值给 s1,就完成了这个实例化接口的交接仪式 s1 = b1 //打印一下:调用原始的接口的student 的实例s1去调用。虽然b1也可以调用。但是一般不这样用。 fmt.Println(s1.StudentName()) 输出:zhangsan </code></pre>

这是我们常见的实现接口的方式,重点是<code>s1 = b1</code> 这个很梦幻的接口实现方式。

<h2>
2. 通过函数返回值的方式</h2>

还有其他几种,也试一下,参考了<code>errors</code>包实现了<code>error</code>接口的方式。

<pre><code>//定义1个接口student,它包含1个 StudentName 方法 type student interface { StudentName() string } //定义1个结构体 type Boy struct { Name string } //搞了1个New方法,返回类型写student, 返回内容实例化Boy{name} func New(name string) student { return Boy{name} } //给他这个结构体绑定一个方法 StudentName。这样就表示它实现了 student接口 func (a Boy) StudentName() string { return a.Name } </code></pre>

我们调用一下进行实例化接口,怎么做呢?

<pre><code>b1 := New("lisi") fmt.Println(b1.StudentName()) //打印:lisi </code></pre>

我们仔细分析一下。这个实现方式,是怎么省去,实现接口必须要用的这一步:<code>s1 = b1</code> 的。

<pre><code>//我们对比下,这种方式和上面的区别 func New(name string) student { return Boy{name} } b1 := New("lisi") /*-----------------------------------------*/ var b1 = Boy{"zhangsan",} var s1 student s1 = b1 ------------------- //既然都能成功,说明,这2种方式是等价的 </code></pre>

开始分析:

<pre><code>var b1 = Boy{"zhangsan",} var s1 student s1 = b1 b1是Boy类型的变量, s1 是student类型的变量。把 s1 = b1 ,实现了接口。 //这个分解一下: func New(name string) student { return Boy{name} } // Boy{name} 其实就等价于 b1, 那么就变成了: func New(name string) student { return b1 } 再看看返回值,返回值是student类型, 也就是说, b1的类型为student,b1的值为student的一个实例。反过来说,student结构体的1个实例 等于 b1 也就等价于: //申明1个student实例 s1 var s1 student //student结构体的1个实例 等于 b1 s1 = b1 ------------------------ 所以,你看下,是不是和上面原始的赋值一样了: var b1 = Boy{"zhangsan",} var s1 student s1 = b1 ------------------------------ 非常巧妙,但是新手很难理解。多看看几遍就好了。 </code></pre> <h2>
3. 通过数组的方式</h2>

还是上面这个例子,我们看看如何用数组切片的方式,来实现接口。

<pre><code>b1 := Boy{"zhangsan",} d11 := []student{b1} fmt.Println(d11[0].StudentName()) // 打印:zhangsan </code></pre>

又迷惑了?这一顿操作下来,又是怎么把<code>s1=b1</code> 省略的呢?

我们接着分析下:

<pre><code>d11 := []student{b1} 是个数组,它里面子元素的类型为student 也就是等价于: var b1 student = Boy{"zhangsan",} 正常的应该是这样: var s1 student var b1 = Boy{"zhangsan",} 因为要实现接口,就必须要把 s1 = b1 所以也就是: s1和b1 换一个位置。b1 的值也跟着过来了。 于是得到了下面这个: var b1 student = Boy{"zhangsan",} 就就隐含的实现了 s1 = b1 真的是太巧妙了。 </code></pre>

有点烧脑。多看几遍多写几遍就熟悉了。

<h2>
4. 简写方式</h2>

上面数组的方式,他的分析过程,可以简化一下:

<pre><code>var s1 student = Boy{"zhangsan",} fmt.Println(s1.StudentName()) // zhagnsan </code></pre>

我们继续分析一下,其实第一种方式的缩写版本,省去了<code>b1</code>

<pre><code>正常写法是这样: var s1 student var b1 = Boy{"zhangsan",} s1 = b1 我们把b1直接省去: var s1 student s1 = Boy{"zhangsan",} 连在一起申明并定义: var s1 student = Boy{"zhangsan",} 就这样,一行代码就实现接口。牛逼!!! </code></pre>

多看多些多练习,就没那么烧脑了!

到此这篇关于“go中实现接口的几种方式”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
19小接口的妙用
go中实现接口的几种方式
go语言学习-接口赋值的两种类型
Go语言空接口类型(interface{})
Golang学习笔记(十二):接口的声明与使用
Go学习笔记:接口实现与指针
第07章 Go语言接口(interface),Golang接口(interface)
Go 语言到底适合干什么?
Go 之 interface接口理解
2020-10-18Go语言接口

[关闭]
~ ~