go语言学习笔记(十三)——接口类型
在Go语言的语境中,我们在谈论接口时,一定指的是接口类型。因为接口类型与其他数据类型不同,我们既不能通过调用new函数或make函数创建出一个接口类型的值,也无法用字面量来表示一个接口类型的值。
对于某一个接口类型来说,如果没有任何数据类型可以作为它的实现,那么该接口的值就不可能存在
<ul><li> <h2>定义</h2> </li></ul>通过关键字type和interface我们可以声明出接口类型,{}下包裹的是它的方法定义。如下例
<pre class="has"><code class="language-Go">type Pet interface { SetName(name string) Name() string Category() string }</code></pre> <ul><li> <h2>实现</h2> </li></ul>对于任何的数据类型,只要它的方法集合中完全包含了一个接口的全部方法,那么他就是这个接口的实现类型。无需显式地声明
<pre class="has"><code class="language-Go">type Dog struct { name string // 名字。 } func (dog *Dog) SetName(name string) { dog.name = name } func (dog Dog) Name() string { return dog.name } func (dog Dog) Category() string { return "dog" }</code></pre>这时我们可以说Dog类型是pet接口的实现类型
<ul><li> <h2>赋值</h2> </li></ul>注意事项
(1) 类型T的对象赋值给接口变量时,要求类型T的所有方法的接收器类型必须是T
(2) 类型*T的对象赋值给接口变量时,类型T的方法接收器类型可以是T或者*T
(3) 在golang中,只要两个接口具有相同的方法列表,那么他们就是等同的,就可以相互赋值;如果一个接口的方法列表包含了另一个接口的方法列表,那么可以将大的接口变量赋值给小的接口变量
<ul><li> <h2>接口组合</h2> </li></ul>与结构体类型间的嵌入很相似,我们只要把一个接口类型的名称直接写到另一个接口类型的成员列表中就可以了
接口类型的嵌入更要简单一些,它不会涉及方法间的屏蔽。只要组合的接口之间有同名的方法就会产生冲突,从而无法通过编译,即使同名方法的签名彼此不同也会是如此
<pre class="has"><code class="language-Go">type Animal interface { ScientificName() string Category() string } type Pet interface { Animal Name() string }</code></pre>此时,animal接口包含的所有方法也就成为了pet的接口方法
善用接口组合和小接口可以让程序框架更加稳定和灵活
到此这篇关于“go语言学习笔记(十三)——接口类型”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
go语言学习笔记(十三)——接口类型
go语言学习笔记(第3章)—面向对象编程
想系统学习GO语言(Golang
专家教你如何有效的学习Drupal - Drupal问答
网页标题随机显示名言js代码
go语言学习笔记 — 接口 — 实现接口的条件(2):接口中的方法都被实现
go语言学习笔记 — 接口 — 接口声明:接口是什么,接口的声明形式,开发中常见的接口写法
go语言学习笔记 — 接口 — 接口与类型的关系(2):多个类型可以实现一个(相同)接口
GoLang学习笔记(三十四)接口及空接口
mysql导入导出数据时中文乱码的解决办法