Contents

Go语言如何实现面向对象编程

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,组合优先