30|接口:Go中最强大的魔法
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
Go语言中的接口是一种强大的特性,通过组合的方式实现了高内聚和低耦合的设计。文章介绍了Go语言的组合设计哲学,强调了正交性的重要性,以及Go语言提供的正交语法元素。接口在Go程序的静态结构搭建与耦合设计中扮演着至关重要的角色。文章还详细介绍了垂直组合和水平组合两种主要的组合方式,以及它们的含义与应用范围。此外,文章还介绍了包装器模式、适配器模式和中间件模式的应用,展示了接口在程序设计中的重要作用。最后,文章强调了尽量避免使用空接口作为函数参数类型,提出了关于接口使用的注意事项。整体而言,本文深入浅出地介绍了Go语言中接口的强大特性和灵活应用,对于想要深入了解Go语言接口设计的读者来说,是一篇极具价值的文章。文章内容涵盖了接口的应用模式,强调了使用接口的原因和与Go语言“组合”设计哲学的关联。垂直组合和水平组合作为主要的组合方式得到了详细阐述,同时还介绍了包装器模式、适配器模式和中间件模式的应用。最后,强调了避免使用空接口作为函数参数类型。整体而言,本文对于深入理解Go语言接口设计具有重要意义。
《Tony Bai · Go 语言第一课》,新⼈⾸单¥59
全部留言(30)
- 最新
- 精选
- return老师讲的太好了,虽然定位是入门, 但个人认为, 基础才是最核心的, 老师把基础讲的太透彻了。这个专栏比某些进阶高阶专栏好多了。 这一篇 加深了 我对组合的理解, 感谢老师用心的输出。 好饭不怕晚, 耐心等等老师后续的 高质量知识, 大家别催,品质第一。
作者回复: 👍
2021-12-3131 - Geek_2337af在学习上遇到一个问题,请老师解答: IntSet类型的String方法的接收者是一个指针类型,所以我们不能在一个不能寻址的IntSet值上调用这个方法 type IntSet struct { /* ... */ } func (*IntSet) String() string var _ = IntSet{}.String() // compile error: String requires *IntSet receiver 但是我们可以在一个IntSet值上调用这个方法: var s IntSet var _ = s.String() // OK: s is a variable and &s has a String method 1.怎么理解这个不能寻址的IntSet值 2.调用方法的习惯是直接使用结构体变量(var i InSet),还是j := InSet{},假设方法中不需要使用到这个实例
作者回复: 好问题!👍 1. go规范中说: 只有可寻址的(addressable)的变量在调用*T作为receiver参数类型的方法时,Go才会施展“语法糖”,取其地址再调用对应的方法。关于addressable这个概念比较复杂,在专栏里不便展开,就没有提。var _ = IntSet{}.String() 中的IntSet()是一个中间值,是不可获得其地址的,因此不能被自动转换,因此编译器报错。 2. 调用方法的习惯没有标准😁
2022-02-18211 - aoeGo 中的接口实现的是真里氏替换原则(LSP),再也不用担心父类强转子类后使用子类特有方法的假里氏替换原则了
作者回复: 👍
2022-01-0378 - 文经白老师,这段代码我有点疑问: type HandlerFunc func(ResponseWriter, *Request) 这里是定义了HandlerFunc类型 http.HandlerFunc(greetings) 在这里是不是对greetings做了类型转换?像是int64(123)。我把这个跟对象的初始化有点混淆,觉得要有个字段来存储greetings的值。
作者回复: 你的理解没错!这个在专栏前面的课程中也讲过,这里就是一个类型转换。通过类型转换,HandlerFunc可以让一个普通函数成为实现ServeHTTP方法的对象,从而满足http.Handler接口。
2022-01-1627 - SuperSu先生循循善诱,看的学生直呼过瘾
作者回复: 👍
2022-08-04归属地:辽宁24 - 多选参数特别喜欢白老师讲 Go,这个专栏虽然说是 Go 第一课,但是感觉这内容已经不是基础的内容,而是作为深度入门 Go 的课了。另外,整篇专栏中,老师始终在不断给我讲 Go 的思想,这点真的超 nice。原本我觉得用一门要用它特有的东西,比如 Go 的并发,而白老师让我更深入去理解 Go 的思想,这才是活用一门语言的样子。
作者回复: 👍
2022-01-254 - CalvinGopher 这里说的“中间件”和 PHPer 的“中间件”概念是不是有点像? 但是貌似跟 Javaer 的“中间件”概念不太一样:Javaer 的“中间件”是类似 kafka、zookeeper 等之类的软件项目,而 Gopher 的“中间件”感觉更像是 Javaer 中的“过滤器”、“拦截器”概念?
作者回复: 你说的没错。中间件(middleware)这个词的具体含义要结合具体上下文来看。
2022-01-054 - 撕影犹如看精彩进球集锦,天知道老师在之前倒了多少脚,流了多少汗
作者回复: 👍
2022-11-25归属地:辽宁3 - 文经强烈请求白老师做一次加餐:讲一讲自己的Go语言学习之路,以及自己怎么做到写出来的文章即通俗易懂又足够深入的👍这种能力能学习不?
作者回复: 我自己的学习之路,我还真没有“认真”总结过。手动允悲:)。
2022-01-163 - Geek_73c432type MyError struct { err error } func (e MyError) Error() string { return "fatal error" } func NewError(e error) *MyError { var p *MyError p = &MyError{err: e} return p } 在创建者模式中,我看到创建函数的惯例是返回结构的指针,例如变量 p,但是函数调用后变量 p 所在的栈帧已经被回收了啊,那外部的指针 q := NewError(e) 指向的地址不是无效了么?
作者回复: Go编译器会对各个变量做逃逸分析(escape analysis),对于逃逸的变量,go编译器会将其分配在heap上,这样return 的p在函数NewError外面使用也是安全有效的。
2023-05-13归属地:广东2