在 Golang 中,结构体(struct)和类(class)都是用于数据封装和抽象的手段,但有以下区别:
- 结构体没有类的概念,也没有继承和子类的概念。
- 结构体无法定义方法,只能有函数与之相关联。类可以定义方法。
- 结构体不支持访问控制修饰符,类支持公有(public)和私有(private)等修饰符。
- 结构体的字段可以是任意类型,类的属性通常是同一类型。
- 结构体对应的是结构体类型,类对应的是引用类型。
所以结构体更适用于数据聚合,表示一组具体的信息;类更侧重于抽象和行为的封装。
例如,我们可以这样定义结构体和类:
结构体:
// 用户信息 struct
type User struct {
Name string
Age int
}
类:
// 用户类
type User struct {
Name string
Age int
}
// 类方法
func (u *User) SayHi() {
fmt.Printf("Hi, I'm %s, %d years old\n", u.Name, u.Age)
}
使用:
// 结构体使用
var u1 User = User{"John", 30}
fmt.Println(u1.Name, u1.Age)
// 类使用
u2 := &User{"Jack", 25}
u2.SayHi() // Hi, I'm Jack, 25 years old
所以总结来说:
- 结构体用于数据聚合,表示一组具体信息,没有类的继承、方法等概念。
- 类包含数据和行为,支持继承、方法和访问控制,更侧重抽象和封装。
- 结构体对应值为结构体类型,类对应值为引用类型。
Golang 选择结构体而不是类来实现对象的主要原因是结构体更简洁,更符合 Golang 追求简洁性的设计理念。结构体完全满足数据聚合的需求,而类的继承和方法等语义在 Golang 中可以通过 composition(组合)来实现,所以并不需要引入类的概念。