Go 接口设计的几个实用原则
Go 接口设计的几个实用原则
Go 的接口是隐式实现的。一个类型只要拥有接口要求的方法,就自动实现了这个接口。这让 Go 的抽象非常轻量,但也容易被过度使用。
一、小接口更好维护
Go 标准库里有很多小接口,比如:
1 | type Reader interface { |
小接口更容易组合,也更容易测试。
二、接口由使用方定义
很多初学者会在实现方提前定义大接口:
1 | type UserRepository interface { |
更推荐在真正需要抽象的调用方定义接口。调用方需要什么方法,就定义什么方法。
三、不要为单一实现强行抽象
如果当前只有一个实现,也没有测试替换需求,可以先使用具体类型。等第二个实现出现时再抽象,往往更清晰。
四、接口适合放在哪里
常见位置:
- 外部服务调用边界
- 数据存储边界
- 测试中需要替换实现的地方
- 插件或策略模式
五、命名建议
单方法接口常用 er 结尾:
1 | type Encoder interface { |
但不要为了命名漂亮而牺牲含义。清楚比统一更重要。
六、总结
Go 接口的威力在于简单。小接口、靠近使用方、按需抽象,是比较稳的设计方式。接口不应该让代码变得神秘,而应该让依赖关系变得更清楚。