
go 不支持传统面向对象意义上的接口继承,但可通过接口嵌入(embedding)实现行为契约的组合与复用,从而达成类似 c# 中接口继承的效果。
go 不支持传统面向对象意义上的接口继承,但可通过接口嵌入(embedding)实现行为契约的组合与复用,从而达成类似 c# 中接口继承的效果。
在 Go 语言中,虽然没有 interface IB : IA 这样的显式继承语法,但可以通过接口嵌入(interface embedding) 实现更灵活、更符合组合优于继承原则的设计。嵌入一个接口,等价于将该接口中所有方法声明“展开”到当前接口中,从而形成新的、更丰富的契约。
例如,C# 中常见的继承写法:
interface IA { void MethodX(); }
interface IB : IA { void MethodY(); } // IB 继承 IA,必须实现 MethodX 和 MethodY在 Go 中,我们使用嵌入来等效表达:
type IA interface {
MethodX()
}
type IB interface {
IA // 嵌入 IA 接口(注意:无需字段名,仅类型)
MethodY()
}此时,任何实现了 IB 的类型,必须同时实现 MethodX() 和 MethodY() —— 因为 IA 的全部方法被隐式纳入 IB 的方法集。这正是 Go 接口组合能力的核心体现。
标准库中大量使用了这一模式。最典型的例子是 io.ReadWriteCloser:
type ReadWriteCloser interface {
Reader
Writer
Closer
}它嵌入了 io.Reader、io.Writer 和 io.Closer 三个接口,因此自动包含它们的所有方法(Read, Write, Close),使用者无需重复声明,即可清晰表达“支持读、写与关闭”的完整能力。
✅ 正确用法要点:
- 嵌入接口时,只需写接口类型名(如 Reader),不加字段名,也不加 func();
- 嵌入可多层嵌套(如 IC 嵌入 IB,而 IB 又嵌入 IA),最终方法集为所有嵌入接口方法的并集;
- 嵌入的是接口定义,不是实现;具体类型仍需自行实现所有嵌入后的方法。
⚠️ 注意事项:
- Go 接口中不能嵌入具体类型(如 struct)或非接口类型;
- 不支持“重写”或“覆盖”嵌入接口中的方法 —— 接口只定义契约,不提供实现;
- 嵌入不产生运行时开销,纯编译期静态检查。
总结:Go 以接口嵌入替代继承,强调行为聚合而非类层级。它更轻量、更正交,也更契合 Go “少即是多”(Less is more)的设计哲学。掌握接口嵌入,是写出清晰、可组合、易测试 Go 接口契约的关键一步。


















