Golang 中的结构体(struct)和类有什么区别?

在 Golang 中,结构体(struct)和类(class)都是用于数据封装和抽象的手段,但有以下区别:

  1. 结构体没有类的概念,也没有继承和子类的概念。
  2. 结构体无法定义方法,只能有函数与之相关联。类可以定义方法。
  3. 结构体不支持访问控制修饰符,类支持公有(public)和私有(private)等修饰符。
  4. 结构体的字段可以是任意类型,类的属性通常是同一类型。
  5. 结构体对应的是结构体类型,类对应的是引用类型。

所以结构体更适用于数据聚合,表示一组具体的信息;类更侧重于抽象和行为的封装。

例如,我们可以这样定义结构体和类:

结构体:

// 用户信息 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(组合)来实现,所以并不需要引入类的概念。