go 不支持传统继承,但可通过结构体嵌入(embedding)将已定义的方法“绑定”到多个结构体,避免重复实现;空结构体嵌入是轻量且零开销的复用方案。
在 Go 中,无法像面向对象语言那样直接“绑定”一个独立函数到多个结构体作为方法(如 a.SayHi()),但可以通过结构体嵌入(embedding) 实现等效效果——即让多个结构体共享同一组方法实现,而无需重复编写逻辑。
最简洁、推荐的方式是:将共用方法定义在一个独立的结构体类型上,再将其作为匿名字段嵌入目标结构体。由于该结构体本身不携带状态(例如使用空结构体 struct{} 或仅含方法的轻量结构体),它不会增加内存开销,却能提供完整的接口复用能力。
以下是完整可运行示例:
package main
import "fmt"
// 定义通用行为载体:空结构体 + 方法
type Speaker struct{}
func (s Speaker) SayHi() {
fmt.Println("hi!")
}
// A 和 B 均通过嵌入复用 SayHi
type A struct {
Speaker // 嵌入:A 自动获得 SayHi 方法
}
type B struct {
Speaker // 同样嵌入,零成本复用
}
func main() {
a := A{}
b := B{}
a.SayHi() // 输出: hi!
b.SayHi() // 输出: hi!
}✅ 优势说明:
⚠️ 注意事项:
func sayHiTo(name string) {
fmt.Printf("hi, %s!\n", name)
}
func (a A) SayHi() { sayHiTo(a.Name) }
func (b B) SayHi() { sayHiTo(b.Nickname) }这种模式保持了实现复用,又赋予方法访问各自结构体字段的能力。
总结:Go 中“方法复用”的标准实践不是继承或接口实现,而是嵌入 + 提升(promotion)。合理设计行为载体结构体(如 Speaker, Logger, Validator),再通过嵌入组装功能
,是构建可维护、可组合 Go 代码的核心范式。