Go 接口
Go 接口用方法集合描述能力边界,并通过隐式实现实现解耦,这是 Go 抽象体系的核心支点之一。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
- 所属 MOC: Go 类型系统与抽象 MOC
- 前置概念: Go 的 struct 与方法
- 并列概念: Go 包、导入与可见性
- 易混淆概念: Go 中的值、指针与引用语义
Go 接口
一句话定义
Go 接口是一组方法签名的集合,用来表达“某个类型具备什么能力”,而不是“某个类型属于哪个类层级”。
核心机制 / 工作原理
Go 接口的几个关键点:
- 接口只描述行为,不保存实现
- 类型不需要显式声明“implements”
- 只要方法集满足接口要求,就算实现了该接口
这套机制的价值很大:
- 降低实现和抽象之间的耦合
- 让调用方按能力编程,而不是按具体类型编程
- 更容易写出可测试、可替换的代码
最小例子 / 最小场景
type Reader interface {
Read(p []byte) (n int, err error)
}
只要某个类型定义了这个方法,它就满足 Reader。
这意味着:
- 接口常常放在使用方一侧定义
- 小接口往往比大而全接口更稳定
Go 风格里的接口心智
- 接口更像“能力契约”
- 好接口通常小而精
- 不要为了“显得抽象”而一上来就到处造接口
边界与易混淆点
- 接口值本身也有运行时语义,不只是编译期占位符
nil接口和值为nil的具体类型装进接口后,行为可能不同- 方法集受值接收者和指针接收者影响