Golang 面向对象编程(OOP)超详细讲解
✅ 一、Go 支持 OOP 吗?
Go 虽然没有传统的 OOP 语法(如 class、extends、implements),但它依然支持 OOP 的三大核心特性:
特性 | Go 支持方式 |
---|---|
封装 | 使用结构体 + 方法 + 首字母控制可见性 |
继承 | 通过 组合(embedding) 实现 |
多态 | 通过 接口(interface) 实现 |
🧱 二、结构体:Go 中的“类”基础
示例:
type Person struct { Name string Age int }
结构体(struct
)相当于 OOP 中的类的成员变量。
🔐 三、封装(Encapsulation)
Go 通过结构体 + 方法 + 访问控制(大/小写)实现封装。
✅ 定义方法(绑定到结构体):
func (p Person) SayHello() { fmt.Println("Hello, my name is", p.Name) }
注意 (p Person)
是接收者,可以理解为 this
。
✅ 使用指针接收者修改字段:
func (p *Person) SetAge(age int) { p.Age = age }
📦 四、继承:Go 的组合(Embedding)
Go 没有 extends
,用的是匿名结构体嵌套来实现“继承”行为。
示例:
type Animal struct { Name string } func (a Animal) Move() { fmt.Println(a.Name, "is moving") } type Dog struct { Animal // 匿名嵌套,相当于“继承” Breed string } func main() { d := Dog{Animal: Animal{Name: "Buddy"}, Breed: "Labrador"} d.Move() // ✅ 继承自 Animal }
Dog
自动“继承”了 Animal
的字段和方法。
🧩 五、多态(Polymorphism)+ 接口(Interface)
接口是 Go 中的核心概念,用来实现多态。
示例:
type Speaker interface { Speak() } type Cat struct{} func (c Cat) Speak() { fmt.Println("Meow") } type Dog struct{} func (d Dog) Speak() { fmt.Println("Woof") } func MakeItSpeak(s Speaker) { s.Speak() } func main() { MakeItSpeak(Cat{}) // Meow MakeItSpeak(Dog{}) // Woof }
✅ 多态体现:
-
不同类型(Cat、Dog)实现相同接口(Speaker)
-
函数
MakeItSpeak
接收统一的接口参数,实现“多态行为”
🧰 六、构造函数(Go 没有构造器语法,但可自定义)
func NewPerson(name string, age int) *Person { return &Person{Name: name, Age: age} } p := NewPerson("Tom", 18)
⚠️ 七、访问控制:包级私有 / 公有
名称前缀 | 作用 |
---|---|
大写字母 | 可导出(公共) |
小写字母 | 包内可见(私有) |
📚 八、完整 OOP 示例(结构体 + 封装 + 继承 + 多态)
package main import "fmt" type Animal interface { Speak() } type Dog struct { Name string } func (d Dog) Speak() { fmt.Println(d.Name, "says Woof") } type Cat struct { Name string } func (c Cat) Speak() { fmt.Println(c.Name, "says Meow") } func MakeItSpeak(a Animal) { a.Speak() } func main() { dog := Dog{Name: "Buddy"} cat := Cat{Name: "Kitty"} MakeItSpeak(dog) MakeItSpeak(cat) }
🔍 九、Go OOP 与传统 OOP 的对比
特性 | Java / C++ | Go |
---|---|---|
类 | class | struct |
方法 | class method | struct method (接收者) |
构造函数 | 构造器语法 | 自定义工厂函数 NewXXX() |
继承 | extends / super | 组合 embedding |
接口 | implements | 自动实现 interface |
多态 | 虚方法 / 多态指针 | 接口多态(interface) |
✅ 十、总结一句话
Go 的 OOP 没有传统的 class 和继承语法,而是通过 结构体、接口、组合 来实现面向对象的核心三特性:封装、继承、多态。