学习碎笔-Golang中的"类"
学习碎笔-Golang中的"类"
在 Go 语言中,没有传统面向对象编程中的 “类”(class) 概念,但可以通过 结构体(struct) 和 方法(method) 实现类似面向对象的功能。Go 的设计哲学强调组合(composition over inheritance),而非传统的类继承体系。
如何模拟 “类” 的行为?
1. 定义结构体(类似类的属性)
用 struct
定义数据字段,相当于类的成员变量:
type Person struct {
Name string
Age int
}
2. 定义方法(类似类的方法)
通过 接收者(receiver) 将方法与结构体绑定:
// 值接收者(操作副本)
func (p Person) SayHello() {
fmt.Printf("Hello, I'm %s, %d years old.\n", p.Name, p.Age)
}
// 指针接收者(操作原对象)
func (p *Person) Grow() {
p.Age++
}
相关知识:学习碎笔-Golang中什么是接收者
3. 构造函数(类似类的实例化)
Go 没有构造函数的语法,但可以通过工厂函数模拟:
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}
// 使用
p := NewPerson("Alice", 30)
相关知识:学习碎笔-Golang中什么是工厂函数
继承的替代方案:组合(Composition)
Go 通过 结构体嵌入(Embedding) 实现组合:
type Animal struct {
Name string
}
func (a *Animal) Move() {
fmt.Println(a.Name, "is moving")
}
// Dog "继承" Animal 的字段和方法
type Dog struct {
Animal // 嵌入结构体(相当于继承字段和方法)
Breed string
}
// 重写父方法
func (d *Dog) Move() {
fmt.Println(d.Name, "is running")
}
// 使用
dog := Dog{
Animal: Animal{Name: "Buddy"},
Breed: "Golden Retriever",
}
dog.Move() // 输出: Buddy is running
dog.Animal.Move() // 显式调用父方法: Buddy is moving
多态的替代方案:接口(Interface)
Go 通过接口实现多态:
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
type Square struct {
Side float64
}
func (s Square) Area() float64 {
return s.Side * s.Side
}
// 多态调用
func PrintArea(s Shape) {
fmt.Println("Area:", s.Area())
}
// 使用
PrintArea(Circle{Radius: 5}) // 输出圆的面积
PrintArea(Square{Side: 4}) // 输出正方形的面积
相关知识:学习碎笔-Golang中的接口
关键特性总结
传统 OOP 概念 | Go 实现方式 |
---|---|
类(Class) | 结构体(struct) |
方法 | 接收者绑定的函数 |
继承 | 结构体嵌入(组合) |
多态 | 接口(interface) |
封装 | 首字母大小写控制可见性 |
Go 通过简洁的语法实现了面向对象的核心思想,避免了传统类继承的复杂性,更强调代码的灵活性和可组合性。
学习碎笔-Golang中的"类"
http://localhost:8090//archives/uws9KNwa