golang 切片 接口_如何理解Golang中的接口?
个人认为,要理解 Go 的接口,一定先了解下鸭子模型。
鸭子模型
那什么鸭子模型?
鸭子模型的解释,通常会用了一个非常有趣的例子,一个东西究竟是不是鸭子,取决于它的能力。游泳起来像鸭子、叫起来也像鸭子,那么就可以是鸭子。
动态语言,比如 Python 和 Javascript 天然支持这种特性,不过相对于静态语言,动态语言的类型缺乏了必要的类型检查。
Go 接口设计和鸭子模型有密切关系,但又和动态语言的鸭子模型有所区别,在编译时,即可实现必要的类型检查。
什么是 Go 接口
Go 接口是一组方法的集合,可以理解为抽象的类型。它提供了一种非侵入式的接口。任何类型,只要实现了该接口中方法集,那么就属于这个类型。
举个例子,假设定义一个鸭子的接口。如下:
type Duck interface {
Quack() // 鸭子叫 DuckGo() // 鸭子走}
假设现在有一个鸡类型,结构如下:
type Chicken struct {
}
func (c Chicken) IsChicken() bool {
fmt.Println("我是小鸡")
}
这只鸡和一般的小鸡不一样,它比较聪明,也可以做鸭子能做的事情。
func (c Chicken) Quack() {
fmt.Println("嘎嘎")
}
func (c Chicken) DuckGo() {
fmt.Println("大摇大摆的走")
}
注意,这里只是实现了 Duck 接口方法,并没有将鸡类型和鸭子接口显式绑定。这是一种非侵入式的设计。
我们定义一个函数,负责执行鸭子能做的事情。
func DoDuck(d Duck) {
d.Quack()
d.DuckGo()
}
因为小鸡实现了鸭子的所有方法,所以小鸡也是鸭。那么在 main 函数中就可以这么写了。
func main() {
c := Chicken{}
DoDuck(c)
}
执行正常。如此是不是很类似于其他语言的多态,其实这就是 Go 多态的实现方法。
空接口
继续说说空 interface。
如果一个 interface 中如果没有定义任何方法,即为空 interface,表示为 interface{}。如此一来,任何类型就都能满足它,这也是为什么当函数参数类型为 interface{} 时,可以给它传任意类型的参数。
示例代码,如下:
package main
import "fmt"
func main() {
var i interface{} = 1
fmt.Println(i)
}
更常用的场景,Go 的 interface{} 常常会被作为函数的参数传递,用以帮助我们实现其他语言中的泛型效果。Go 中暂时不支持 泛型,不过 Go 2 的方案中似乎将支持泛型。
总结
回答结束,做个简单总结。理解 Go 接口要记住一点,接口是一组方法的集合,这句话非常重要,理解了这句话,再去理解 Go 的其他知识,比如类型、多态、空接口、反射、类型检查与断言等就会容易很多。
golang 切片 接口_如何理解Golang中的接口?相关推荐
- java的接口怎么理解_如何理解Java 中的接口
一.接口(Interface) 在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法.接口并不是类,编写接口的方 ...
- golang interface 类型转换_无符号Golang程序逆向方法解析
在去年的inctf2018中,出现了一道Go语言编写的进程通信逆向题,无论是从题目整体设计还是解题思路上来说都独树一帜,自己在解题过程中遇到了很多问题,但我这不打算做过多探讨,网上也有大佬的解题过程, ...
- java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序
本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...
- java回调如何理解_如何理解java中的回调
以android中的Button的setOnClickListener这个回调为例: Button button = (Button)this.findViewById(R.id.button); b ...
- java 关注公众号没有调接口_深入理解Java继承、封装、多态的实现原理
点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...
- JAVA设计一个电视机类_漫谈Java程序设计中的接口应用
Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in ...
- python iterable对象_如何理解Python中的iterable对象
转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...
- python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...
正确理解python中的关键字"with"与上下文管理器 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: 正确理解python中的关键字&quo ...
- golang微信机器人_如何使用Golang从头开始创建Twitter机器人
golang微信机器人 by Kofo Okesola 由Kofo Okesola 如何使用Golang从头开始创建Twitter机器人 (How to create a Twitter bot fr ...
最新文章
- 网络营销——网络营销专员浅析网站快照更新要点
- vs 正则表达式替换
- python 优雅的 列表推导式(for in if)生成器表达式 集合推导式和字典推导式 列表动态构建器(不用先创建空容器【空列表】,再一个一个append()进去那样麻烦了)
- 在java中使用base64加密解密的方法
- 打破技术型思维:产品经理的门槛在门里面
- OpenGL Primitive Restart原始重启的实例
- HTML和CSS常见问题整理
- php 数组重新打乱_PHP 将数组打乱 shuffle函数的用法及简单实例
- mysql集群之MHA简单搭建
- java将图片压缩到指定大小以内并保存图片
- 【POJ 2719 --- Faulty Odometer】
- policy服务器未能登录,win7电脑提示group policy client服务未能登录的解决方法
- 解决PowerShell上运行脚本被禁用错误
- 腾讯云,云点播,视频合成
- 别让职场形象毁了你的职场前程
- (已修正精度 1mm左右)Realsense d435i深度相机+Aruco+棋盘格+OpenCV手眼标定全过程记录
- 使用virtuoso和calibre对版图进行DRC LVS的检查
- 中国大学MOOC-陈越、何钦铭-数据结构-2022春期中考试
- c语言c11标准 pdf,C语言新标准C11
- Python网络爬虫实战:抓取和分析天猫胸罩销售数据
热门文章
- .net core 正则表达式 获取 等号后面的值_Python3 正则表达式
- vue 浏览器调试 样式如何定位样式_浏览器断点调试-程序员的必修课
- python logger设置信息取得_shell 脚本中如何获取 python logging 打印的信息?
- linux 运行选择哪个cpu核,判断Linux进程在哪个CPU核运行的方法
- pcl点云PCD文件
- android o 结构光流程,惊艳亮相!一分钟看懂OPPO Find X 3D结构光技术是什么鬼,太牛了...
- UserWarning: Matplotlib is currently using agg in Object Detection API
- pmd 设置默认规则,只要使用了该规则集就自动使用
- php 通过array_merge()和array+array合并数组的区别和效率比较
- Unity 协程深入解析与原理