Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
20432 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

28|接口:接口即契约

你好,我是 Tony Bai。
从这一讲开始,我们将进入我们这门课核心篇的学习。相对于前两个篇章而言,这篇的内容更加考验大家的理解力,不过只要你跟上节奏,多多思考,掌握核心篇也不是什么困难的事情。
我先花小小的篇幅介绍一下核心篇的内容。核心篇主要涵盖接口类型语法与 Go 原生提供的三个并发原语(Goroutine、channel 与 select),之所以将它们放在核心语法的位置,是因为它们不仅代表了 Go 语言在编程语言领域的创新,更是影响 Go 应用骨架(Application Skeleton)设计的重要元素
所谓应用骨架,就是指将应用代码中的业务逻辑、算法实现逻辑、错误处理逻辑等“皮肉”逐一揭去后所呈现出的应用结构,这就好比下面这个可爱的 Gopher(地鼠)通过 X 光机所看到的骨骼结构:
通过这幅骨架结构图,你能看到哪些有用的信息呢?从静态角度去看,我们能清晰地看到应用程序的组成部分以及各个部分之间的连接;从动态角度去看,我们能看到这幅骨架上可独立运动的几大机构。
前者我们可以将其理解为 Go 应用内部的耦合设计,而后者我们可以理解为应用的并发设计。而接口类型与 Go 并发语法恰分别是耦合设计与并发设计的主要参与者,因此 Go 应用的骨架设计离不开它们。一个良好的骨架设计又决定了应用的健壮性、灵活性与扩展性,甚至是应用的运行效率。我们后面在讲解接口类型与并发原语的应用模式的时候,还会结合例子深入讲解。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • Calvin
    go1.18 增加了 any 关键字,用以替代现在的 interface{} 空接口类型:type any = interface{},实际上是 interface{} 的别名。

    作者回复: 👍

    38
  • 罗杰
    接口的目的是为了解耦,关于接口在项目还用的非常非常少,几乎没有定义过接口,有点惭愧。

    作者回复: 慢慢来。

    14
  • Sid
    为什么这里的Type不是Myinterface而是nil呢?

    作者回复: 可以这样理解: i = int64(13) v2, ok := i.(MyInterface) // 由于i的动态类型是int64,所以这行类型断言失败。那么v2虽然静态类型为MyInterface,但其动态类型的值为nil。 而fmt.Printf结合T%输出的是接口类型变量的动态类型的类型信息,所以输出nil。

    4
    12
  • 菠萝吹雪—Code
    思考题 1、如果 Go 中没有接口类型,会发生什么,会对我们的代码设计产生怎样的影响? (1)代码会产生严重的耦合,系统的扩展性会变低,时间长了代码会变得冗余难以维护 (2)有接口类型可能在代码阅读上产生一定的难度 2、关于尽量定义小接口,你有什么好方法? 随着系统的演进,不断的抽象、提取

    作者回复: 大大的👍

    归属地:北京
    8
  • 邵康
    我是一个Java程序员,原来面对不完美的接口可以直接修改接口,然后很容易找到并修改它的实现类,但是go中,遇到需要修改接口时,很难找到它的全部实现类并修改,有什么好办法吗?

    作者回复: 我个人用vim编辑器,目前还没找到什么好插件可以搜索到某个接口的所有实现类型。不知道其他编辑器,比如vscode、goland是否有这类功能。 一个比较粗糙的方法就是:先修改接口,然后编译一遍程序,根据go compiler提供的error信息找到那些实现类型,然后逐一改之(手动允悲)。

    4
    7
  • singularity of space time
    读完了go的接口概念以及接口的实现基于方法集合之后有个问题,就是按老师之前说的go的一大理念就是显式,不支持隐式的转化,但是到了接口这里,相较于java实现对应接口时会直接implement对应的接口的语法而言,个人感觉go接口的实现不免显得过于隐式了,而且接口和实现的分离本身已经是很大程度上的解耦合了,真的有必要像go这样将实现者连实现了谁这样的耦合关系也隐藏起来嘛?

    作者回复: 文中的“隐式”更多是因为接口与Go语言其他部分是正交的关系,建议先看完第30讲。

    4
  • Demon.Lee
    请假老师一个接口名字的大小写问题:我看 type error intereface{...} 这里用小写字母开头,而 io.Reader 则是 type Reader interface{...} 大写字母开头,我测试了一下,这个大小写并不影响实现,我在 A 包里面定义的接口,在 B 包里面实现对应的方法没有问题(当然,方法是 exported 的)。所以,这个接口名称定义最佳实践是什么,混着用?

    作者回复: error这个接口是特殊的。它是Go预定义的接口,可以不用考虑导出不导出,在哪里都可以使用。 但是我们自定义的接口类型,如果要在包外访问,则必须是头母大写的导出标识符。

    2
    3
  • lesserror
    请问一下大白老师,一般错误输出的堆栈中都有类似这样的信息:main.go:20 +0x22d,请问像类似 +0x22d 这样的字符 代表的是什么呢?

    作者回复: 这个值好像是该函数在栈帧(stack frame)中的相对位置。

    3
  • AlexWillBeGood
    反射和接口还有即将加入的泛型都可以实现抽象,增加了代码的灵活性

    作者回复: 👍。

    3
  • Soyoger
    小接口契约和抽象体现了抽象的一般过程:穷举、归纳、抽象。

    作者回复: 👍

    归属地:北京
    2
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部