20|面向组合:接口的使用场景与底层原理
郑建勋
你好,我是郑建勋。
在上一节课,我们讲解了文本处理技术。进行文本处理时,我们使用了函数的封装来完成过程的抽象,函数是一种复用代码、帮助我们构建大规模程序的利器。这节课,让我们来看一看另一种可以构建大规模程序的技术:接口。
Go 接口及其优势
在计算机科学中,接口是一种共享边界,计算机系统的各个独立组件可以在这个共享边界上交换信息。这些独立组件可能是软件、硬件、外围设备与人。在面向对象的编程语言中,接口指相互独立的两个对象之间的交流方式。接口有下面几个好处。
隐藏细节
接口可以对对象进行必要的抽象,外接设备只要满足相应标准(例如 USB 协议),就可以和主设备对接;应用程序只要满足操作系统规定的系统调用方式,就可以使用操作系统提供的强大功能,而不必关注对方具体的实现细节。
解耦
通过接口,我们能够以模块化的方式构建起复杂、庞大的系统。将复杂的功能拆分成彼此独立的模块,不仅有助于我们更好地并行开发系统、提高系统开发效率,也能让我们在设计系统时以全局的视野看待整个系统。模块拆分还有助于我们快速排查、定位和解决问题。
权限控制
接口是系统与外界交流的唯一途径,例如 Go 语言对于垃圾回收只暴露了 GOGC 环境变量及 Runtime.GC API。USB 接口有标准的接口协议,如果外界不满足这种协议,就无法和指定的系统进行交流。所以,系统可以通过接口来控制接入方式和接入方的行为,降低安全风险。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Go语言中接口的使用场景与底层原理。首先介绍了Go语言接口的优势,包括隐藏细节、解耦和权限控制。接着讲解了Go语言接口的设计理念,指出Go语言采用了面向组合的设计模式,通过接口实现的扁平化设计模式取代了基于类型的继承。接口的最佳实践部分从模块解耦和依赖注入两个方面说明了在Go中使用接口的好处。通过实例分析,展示了如何通过接口实现模块解耦,提高代码的通用性和可扩展性。文章还深入探讨了接口的底层结构和多态的概念,以及使用接口的成本和性能损失。最后,文章提到了在go1.18之后,泛型扩展了接口的能力,实现类型的约束。整体而言,本文对于读者快速了解面向组合接口的使用场景与底层原理具有很高的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- lygoos: darwin goarch: arm64 pkg: goup BenchmarkDirect-10 473992540 2.476 ns/op BenchmarkInterface-10 483796916 2.479 ns/op BenchmarkInterfacePointer-10 483879259 2.483 ns/op PASS ok goup 4.484s go1.20的测试...
作者回复: Go的编译器越来越好了哈
2023-02-10归属地:贵州1 - 青鹿请问,代码项目地址有吗?
作者回复: https://github.com/dreamerjackson/crawler
2023-02-09归属地:上海 - 舟小晓goos: linux goarch: amd64 pkg: go-crawler/type-test cpu: 13th Gen Intel(R) Core(TM) i5-1340P BenchmarkDirect-16 582977156 2.013 ns/op BenchmarkInterface-16 698875952 1.798 ns/op BenchmarkInterfacePointer-16 605027127 1.975 ns/op PASS ok go-crawler/type-test 4.219s go 1.22rc22024-02-06归属地:浙江
- 牙小木trade的部分,大概是这个意思 ``` package main import ( "context" "github.com/go-xorm/xorm" "gorm.io/gorm" ) //声明一个统一的insert接口 type DBer interface { InsertRow(ctx context.Context, instance ...interface{}) } type XormDB struct { db *xorm.Session } func (xorm *XormDB) InsertRow(ctx context.Context, instance ...interface{}) { xorm.db.Context(ctx).Insert(instance) } type GormDB struct { db *gorm.DB } func (gorm *GormDB) InsertRow(ctx context.Context, value ...interface{}) { gorm.db.Create(value) } //定义业务统一操作 type Trade struct { db DBer } func (t *Trade) AddDB(db DBer) { t.db = db } func (t *Trade) AddTrade(ctx context.Context, instance ...interface{}) { t.db.InsertRow(ctx, instance) } func main() { //dber:=&XormDB{} orm := &GormDB{} t := &Trade{db: orm} ctx := context.Background() t.AddTrade(ctx, "xiaoming,28") } ```2023-08-16归属地:北京
- 牙小木cpu: Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz BenchmarkDirect-4 412734510 2.860 ns/op BenchmarkInterface-4 331038409 3.693 ns/op BenchmarkInterfacePointer-4 327338402 3.640 ns/op PASS2023-08-16归属地:北京
- 爱编程的运维老师,你上面的代码怎么测试啊? 我新建了一个test.go文件,然后把代码复制进去,再在命令行执行: go test -gcflags "-N -l" -bench=. 提示:? gitee.com/qiankai_git/crawler.git [no test files]2023-04-12归属地:广东1
- Geek_8ed998这个接口不是实现的insert方法吗,怎么又可以调用creat阿2023-02-23归属地:上海
收起评论