什么是接口(Interface)

其实说白了,接口就是一种协议,统一一个标准。你要调用我,那你就必须实现我的这些方法。我不需要知道你是怎么实现的,但是你一定要实现。甚至在Objec-C当中都不叫interface,直接protocol。

我相信不少刚接触interface的人会跟我有一样的疑惑,我实现接口跟不实现接口没什么区别啊?反正都要实现这些方法。问题的误区就在于,接口的使用并不是单人开发模式的。你写接口你写实现,就不用写接口了。我写接口你实现,接口不就用上了。我不给你规定好了,你怎么知道该实现哪些内容呢。实际上也就是个“规范”。

我实现了某个服务,你可以来调用我的服务,但是调用我的服务之前你必须满足某些约束(实现方法),才能调用我写好了这些服务。这个时候接口的作用就出来了,接口约束了你必须满足的前置条件。看完下面的代码,你就明白了:

package mainimport ("fmt"
)type Sorter interface {Len() intLess(i, j int) boolSwap(i, j int)
}func Sort(x Sorter) {for i := 0; i < x.Len()-1; i++ {for j := i + 1; j < x.Len(); j++ {if x.Less(i, j) {x.Swap(i, j)}}}
}type Xi []int
type Xs []stringfunc (p Xi) Len() int               { return len(p) }
func (p Xi) Less(i int, j int) bool { return p[j] < p[i] }
func (p Xi) Swap(i int, j int)      { p[i], p[j] = p[j], p[i] }func (p Xs) Len() int               { return len(p) }
func (p Xs) Less(i int, j int) bool { return p[j] < p[i] }
func (p Xs) Swap(i int, j int)      { p[i], p[j] = p[j], p[i] }func main() {ints := Xi{44, 67, 3, 17, 89, 10, 73, 9, 14, 8}strings := Xs{"nut", "ape", "elephant", "zoo", "go"}Sort(ints)fmt.Printf("%v\n", ints)Sort(strings)fmt.Printf("%v\n", strings)
}

我已经实现好了排序方法,但是我不知道你会传入什么进行排序。于是我写了个接口,你只要实现了接口的全部方法,那么我就允许你调用我的服务,进行排序。

GO语言接口设计

在其他编程语言当中,都是谁提供服务,谁提供接口。你需要调用我的服务,就必须声明你实现了我的接口。

翻译成人话就是我通过一些特定逻辑完成了某个功能,别的模块想要调用我这个功能,就必须把我这个功能里使用的这些函数都给实现了。

而这在逻辑上实际是说不通的,服务提供者怎么会确切的知道服务使用者的具体需求呢?当需求发生变化的时候,服务提供者就需要考虑使用者的需求,从而设计接口。而从理论上来说,每一个服务的开发人员都应该专注于自己的服务。

而go语言不同。go语言的接口是非侵入式接口,只要调用者本身实现了该接口的全部方法,就默认实现了该接口(事实上也确实是实现了这个接口),而不需要显示的声明实现某个接口。这极大的方便了接口的调用,开发人员不必再需要苦想接口的粒度,只需要专注功能函数的实现就可以了。

声明:sunansheng 发表于 2019-04-25 21:54:00 ,共计680字。

转载请署名:Go语言接口为什么是颠覆性的? | www.sunansheng.com

Go语言接口为什么是颠覆性的?相关推荐

  1. 巨变的时代、人工智能AI带来颠覆性的影响、技术十大趋势

    https://www.toutiao.com/a6626981566553784835/ 导读:我们身处一个巨变的时代,毋庸置疑,人工智能 (AI) 已经成为科技前沿之一,将给许多行业带来颠覆性的影 ...

  2. 【技术趋势】德勤发布2020技术趋势报告,五个新趋势可引发颠覆性变革

    来源:产业智能官 "2020 年的趋势将颠覆整个行业,并在未来十年重新定义业务,即使数字创新已成为各种规模企业的常规行为."德勤管理咨询新兴技术研究总监兼政府及公共服务首席技术官 ...

  3. 未来可能发生的十大颠覆性创新

    转自:工信头条 本文发表于<中国工业和信息化>杂志2019年5月刊总第12期 科技作家凯文·凯利认为:"未来在其初期将发展得非常缓慢,随之便可一蹴而就."随着时间缓慢出 ...

  4. 2015年IT领域里Docker和其它颠覆性的趋势

    本文讲的是2015年IT领域里Docker和其它颠覆性的趋势,[编者的话]文中作者介绍了2015年IT领域的一些颠覆性的趋势,比如Docker将如何革新PaaS.IaaS等,Docker将如何颠覆虚拟 ...

  5. 不能头脑一热,就布局颠覆性技术、上马未来产业

    来源:财经国家周刊 作者:曹方 何颖 姬少宇 张鹏 近年来,布局.规划及培育人工智能与机器人.先进材料.新能源.生命科学.云计算和量子计算.混合现实等颠覆性技术.未来产业,成为不少地方政府推动当地产业 ...

  6. 德勤发布2020技术趋势报告,五个新趋势可引发颠覆性变革

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! "2020 年的趋势将颠覆整个行业,并在未来十年重新定义业务,即使数字创新已成为各种规模 ...

  7. 这是一项颠覆性技术 - 容器

    我从14年开始关注容器技术,15年开始使用容器技术,这些年看到了容器技术爆发式发展.版本的快速迭代,记得当时Docker版本还是0.7,Kubernetes版本是1.0,到现在Docker CE 18 ...

  8. 区块链:重新定义世界,崛起于草根的“颠覆性”技术

    区块链技术是指通过去中心化的方式集体维护一个可靠数据库的技术方案.发展至今,区块链已经吸收了分布式架构.块链式数据验证与存储.点对点网络协议.加密算法.共识算法.身份认证.智能合约.云计算等多项技术, ...

  9. 苹果商店开发者能不能不找到评论人_App Store颠覆性改版,对用户和开发者的影响...

    iOS 11带了很多新功能和新设计,而App Store这次也迎来了全面更新--不光是结构调整,差不多是整个逻辑都有改动.那么,App Store如此巨变的原因是什么?会有什么影响?一起来看下作者的解 ...

最新文章

  1. postgresql 数据库远程访问
  2. vb破解万能断点816c24
  3. jQuery.extend 函数使用详解
  4. 分计算iv值_S71200PLC模拟量编程方法与计算原理
  5. matlab 三维模型怎么导入ansys,Ansys怎么导入模型?Ansys导入模型的方法
  6. C#托管代码调用C++非托管代码
  7. 移除inline-block间隙
  8. 拒绝无用的长篇大论!仅12张图片,最全的中台精华都在这里了
  9. Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从
  10. wpf menuitem 点击控件元素_一招教你如何在WPF界面开发时自定义外观,快来Get
  11. 怎么用计算机技术预测蛋白质结构,蛋白质结构预测及方法介绍 一搜索无重复 - 生物科学 - 小木虫 - 学术 科研 互动社区...
  12. element-UI table自定义表头
  13. 用中位数代替平均数来衡量民生指标
  14. js小学生图片_小学生画报设计图片
  15. 美团2021届秋季校园招聘笔试真题解析:小美的跑腿代购
  16. 查看安卓系统的外接USB声卡
  17. HTML协议目标端口和源端口,协议:TCP源IP:源端口:80目的IP:目的端口:4049TT? 爱问知识人...
  18. 流程图和火车程序Jackson图
  19. 你知道不注册国外邮箱也能往国外发邮件吗?
  20. Discover中英文显示问题

热门文章

  1. Java实现哈希函数/散列算法
  2. openssl库编译-及16进制的key转Rsa数据结构
  3. python算法简单了解
  4. realsense-ros安装
  5. java程序调试步骤
  6. linux pureftpd 卸载,lnmp卸载pureftpd服务简单命令
  7. MQ 系列之初识消息中间件
  8. Python基础编程:利用列表实现简单的先进后出、先进先出
  9. 动态规划经典算法状态转移方程总结
  10. java包装和引用_回顾值传递和引用传递关于Java是值传递还是引用传递,网上有不一样的说法。1、基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递。2...