
在 go 语言中,可通过结构体嵌入(embedding)将已定义的方法“共享”给多个结构体,避免重复实现;空结构体嵌入是零开销、高内聚的常用模式。
Go 不支持传统面向对象中的继承或方法动态绑定,但提供了结构体嵌入(embedding)这一核心机制,用于实现方法的复用与组合。当多个结构体需要共用同一组无状态、不依赖接收者字段的行为(如 SayHi())时,最佳实践是将其封装为一个独立类型的方法,并通过匿名字段嵌入到目标结构体中。
以下是一个完整、可运行的示例:
package main
import "fmt"
// 定义通用行为载体:空结构体 + 方法
type Speaker struct{}
func (s Speaker) SayHi() {
fmt.Println("hi!")
}
// A 和 B 均嵌入 Speaker,自动获得 SayHi 方法
type A struct {
Speaker // 匿名字段 → 启用方法提升(method promotion)
}
type B struct {
Speaker
}
func main() {
a := A{}
b := B{}
a.SayHi() // 输出: hi!
b.SayHi() // 输出: hi!
}✅ 关键优势:
本文档主要讲述的是Matlab语言的特点;Matlab具有用法简单、灵活、程式结构性强、延展性好等优点,已经逐渐成为科技计算、视图交互系统和程序中的首选语言工具。特别是它在线性代数、数理统计、自动控制、数字信号处理、动态系统仿真等方面表现突出,已经成为科研工作人员和工程技术人员进行科学研究和生产实践的有利武器。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 零内存开销:Speaker{} 是空结构体(struct{}),大小为 0,嵌入后不增加 A 或 B 的内存占用;
- 方法自动提升:Go 编译器会将 Speaker.SayHi 提升为 A.SayHi 和 B.SayHi,调用完全透明;
- 单一维护点:逻辑只在一处定义,修改即全局生效。
⚠️ 注意事项:
- 若方法需访问接收者自身的字段(例如 a.Name 或 b.ID),则无法仅靠嵌入解决——此时应将公共逻辑提取为普通函数或带参数的辅助函数,再由各结构体方法分别调用。例如:
func sayHiTo(name string) { fmt.Printf("hi, %s!\n", name) }
func (a A) SayHi() { sayHiTo("A") }
func (b B) SayHi() { sayHiTo("B") }- 接口(interface)在此场景中不适用:接口定义契约,但不提供实现;它不能“赋予”方法,只能约束已有方法是否满足某行为。
总结来说,Go 的哲学是组合优于继承。通过嵌入轻量载体类型(尤其是空结构体),你可以在保持类型清晰性的同时,高效复用无状态方法——这是地道、高效且符合 Go 惯用法的解决方案。









