Go语言如何实现面向对象编程
Contents
Go 没有类(class),但它依然支持 封装、继承(组合)、多态 这些面向对象思想,只是实现方式和传统语言(Java/C++/Python)不同。
1. struct(结构体)代替 class ✅ 非常常用
Go 用 struct 表示对象的数据。
在所有实际项目中,几乎所有业务实体都要用 struct。
type Person struct {
Name string
Age int
}📌 类比:
- Java / C++ 的
class→ Go 的struct
2. 方法(method)绑定在类型上 ✅ 非常常用
Go 通过“接收者”把函数绑定到结构体,实现类似类的方法。
type Person struct{ Name string }
func (p *Person) Greet() {
fmt.Println("Hi, I'm", p.Name)
}📌 类比:
- Java 的
p.greet() - Go 的
p.Greet()
👉 常用程度:所有项目都会用
3. 封装:首字母大小写控制可见性 ✅ 非常常用
Go 没有 public/private,而是用 首字母大小写 控制导出。
type User struct {
Name string // 公有
age int // 私有
}📌 类比:
- Java:
public/private - Go:大写 / 小写
👉 常用程度:非常常用(包间 API 设计必备)
4. 继承:通过组合(Composition)实现 ✅ 常用
Go 没有继承,用 结构体嵌套 来实现代码复用。
type Animal struct{ Name string }
func (a Animal) Speak() { fmt.Println("I am", a.Name) }
type Dog struct {
Animal
Breed string
}👉 常用程度:经常使用,Go 推荐「组合优于继承」
5. 多态:接口(interface)+ 隐式实现 ✅ 非常常用
Go 的接口是 隐式实现 的,不需要写 implements。
这是 Go 最独特的 OOP 特性,在解耦和依赖注入时必用。
type Speaker interface{ Speak() }
type Cat struct{}
func (c Cat) Speak() { fmt.Println("Meow") }
type Dog struct{}
func (d Dog) Speak() { fmt.Println("Woof") }👉 常用程度:中大型项目必备,Go 框架广泛使用
6. 构造函数(工厂函数) ✅ 常用
Go 没有 constructor,通常用函数返回结构体实例。
func NewPerson(name string, age int) *Person {
return &Person{Name: name, Age: age}
}👉 常用程度:常见于库/框架,业务代码里也经常用
7. 模拟继承(接口 + 组合) ⚪ 偶尔使用
在必须模仿继承时,用接口 + 组合模拟。 不过 Go 社区更推荐 组合,而不是「继承式层级」。
👉 常用程度:不常见,一般只在特殊场景下使用
📊 常用程度总结表
| 特性 | 使用频率 | 说明 |
|---|---|---|
| struct(结构体) | ⭐⭐⭐⭐⭐ | 所有项目都用 |
| 方法绑定(method) | ⭐⭐⭐⭐⭐ | 类似类方法,常用 |
| 封装(大小写控制) | ⭐⭐⭐⭐⭐ | Go 独有且常用 |
| 组合(代替继承) | ⭐⭐⭐⭐ | 推荐做法,常见 |
| 接口 + 多态(隐式实现) | ⭐⭐⭐⭐⭐ | 解耦核心机制 |
| 构造函数(工厂函数) | ⭐⭐⭐⭐ | 常用,尤其在库中 |
| 模拟继承(接口+组合) | ⭐⭐ | 偶尔使用 |
🎯 总结
- Go 的 OOP 和 Java/C++ 不同,更轻量: struct + method + interface + composition
- 非常常用:
struct、方法、接口、多态、封装。 - 推荐使用:组合代替继承。
- 偶尔使用:模拟传统继承。
👉 可以简单理解为:
- Java/C++ OOP:class-based
- Go OOP:type + method + interface-based,组合优先