个人认为,要理解 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中的接口?相关推荐

  1. java的接口怎么理解_如何理解Java 中的接口

    一.接口(Interface) 在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法.接口并不是类,编写接口的方 ...

  2. golang interface 类型转换_无符号Golang程序逆向方法解析

    在去年的inctf2018中,出现了一道Go语言编写的进程通信逆向题,无论是从题目整体设计还是解题思路上来说都独树一帜,自己在解题过程中遇到了很多问题,但我这不打算做过多探讨,网上也有大佬的解题过程, ...

  3. java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序

    本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...

  4. java回调如何理解_如何理解java中的回调

    以android中的Button的setOnClickListener这个回调为例: Button button = (Button)this.findViewById(R.id.button); b ...

  5. java 关注公众号没有调接口_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

  6. JAVA设计一个电视机类_漫谈Java程序设计中的接口应用

    Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in ...

  7. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  8. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

    正确理解python中的关键字"with"与上下文管理器 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  正确理解python中的关键字&quo ...

  9. golang微信机器人_如何使用Golang从头开始创建Twitter机器人

    golang微信机器人 by Kofo Okesola 由Kofo Okesola 如何使用Golang从头开始创建Twitter机器人 (How to create a Twitter bot fr ...

最新文章

  1. 网络营销——网络营销专员浅析网站快照更新要点
  2. vs 正则表达式替换
  3. python 优雅的 列表推导式(for in if)生成器表达式 集合推导式和字典推导式 列表动态构建器(不用先创建空容器【空列表】,再一个一个append()进去那样麻烦了)
  4. 在java中使用base64加密解密的方法
  5. 打破技术型思维:产品经理的门槛在门里面
  6. OpenGL Primitive Restart原始重启的实例
  7. HTML和CSS常见问题整理
  8. php 数组重新打乱_PHP 将数组打乱 shuffle函数的用法及简单实例
  9. mysql集群之MHA简单搭建
  10. java将图片压缩到指定大小以内并保存图片
  11. 【POJ 2719 --- Faulty Odometer】
  12. policy服务器未能登录,win7电脑提示group policy client服务未能登录的解决方法
  13. 解决PowerShell上运行脚本被禁用错误
  14. 腾讯云,云点播,视频合成
  15. 别让职场形象毁了你的职场前程
  16. (已修正精度 1mm左右)Realsense d435i深度相机+Aruco+棋盘格+OpenCV手眼标定全过程记录
  17. 使用virtuoso和calibre对版图进行DRC LVS的检查
  18. 中国大学MOOC-陈越、何钦铭-数据结构-2022春期中考试
  19. c语言c11标准 pdf,C语言新标准C11
  20. Python网络爬虫实战:抓取和分析天猫胸罩销售数据

热门文章

  1. .net core 正则表达式 获取 等号后面的值_Python3 正则表达式
  2. vue 浏览器调试 样式如何定位样式_浏览器断点调试-程序员的必修课
  3. python logger设置信息取得_shell 脚本中如何获取 python logging 打印的信息?
  4. linux 运行选择哪个cpu核,判断Linux进程在哪个CPU核运行的方法
  5. pcl点云PCD文件
  6. android o 结构光流程,惊艳亮相!一分钟看懂OPPO Find X 3D结构光技术是什么鬼,太牛了...
  7. UserWarning: Matplotlib is currently using agg in Object Detection API
  8. pmd 设置默认规则,只要使用了该规则集就自动使用
  9. php 通过array_merge()和array+array合并数组的区别和效率比较
  10. Unity 协程深入解析与原理