Go 接口设计的几个实用原则
wxk1991 Lv5

Go 接口设计的几个实用原则

Go 的接口是隐式实现的。一个类型只要拥有接口要求的方法,就自动实现了这个接口。这让 Go 的抽象非常轻量,但也容易被过度使用。


一、小接口更好维护

Go 标准库里有很多小接口,比如:

1
2
3
type Reader interface {
Read(p []byte) (n int, err error)
}

小接口更容易组合,也更容易测试。


二、接口由使用方定义

很多初学者会在实现方提前定义大接口:

1
2
3
4
5
6
type UserRepository interface {
Create()
Update()
Delete()
Find()
}

更推荐在真正需要抽象的调用方定义接口。调用方需要什么方法,就定义什么方法。


三、不要为单一实现强行抽象

如果当前只有一个实现,也没有测试替换需求,可以先使用具体类型。等第二个实现出现时再抽象,往往更清晰。


四、接口适合放在哪里

常见位置:

  • 外部服务调用边界
  • 数据存储边界
  • 测试中需要替换实现的地方
  • 插件或策略模式

五、命名建议

单方法接口常用 er 结尾:

1
2
3
type Encoder interface {
Encode(v any) error
}

但不要为了命名漂亮而牺牲含义。清楚比统一更重要。


六、总结

Go 接口的威力在于简单。小接口、靠近使用方、按需抽象,是比较稳的设计方式。接口不应该让代码变得神秘,而应该让依赖关系变得更清楚。