Go-04-结构体、方法与接口
本节目标:理解 Go 的”无 class 但有 struct+method+interface”组合,掌握封装、组合(代替继承)、多态。
1. 结构体(struct)
struct 是字段的集合,是 Go 的”类”:
1 | type Person struct { |
访问字段:
1 | p := Person{Name: "Alice", Age: 25} |
匿名字段(嵌入) —— Go 的”继承”:
1 | type Address struct { |
2. 方法(method)
方法就是绑定到特定类型的函数:
1 | type Rectangle struct { |
值接收者 vs 指针接收者:
- 想要修改接收者 → 必须用指针
- 接收者是大结构体 → 用指针避免复制
- 保持一致性:一个类型的方法,要么全用值接收者,要么全用指针接收者
1 | r := Rectangle{3, 4} |
3. 接口(interface)
接口是方法签名的集合。一个类型只要实现了接口的所有方法,就隐式满足该接口(不需要 implements 关键字):
1 | // 定义接口 |
4. 接口的”鸭子类型”
Go 的接口是结构化类型(structural typing),也叫”鸭子类型”——只要长得像鸭子,就当作鸭子:
1 | type Duck interface { |
任何类型只要有 Quack() string 方法就满足 Duck,不需要显式声明 implements。
5. 空接口 interface{}
interface{}(或 Go 1.18+ 的 any)没有任何方法,所有类型都满足它。常用于”可以接受任意类型”的场景:
1 | func describe(v interface{}) { |
6. 多态实战:通用排序
Go 的 sort.Sort 接口:
1 | type Interface interface { |
实现这个接口就能被 sort.Sort 排序:
1 | type ByLength []string |
Go 1.21+ 内置 slices.Sort / slices.SortFunc(推荐):
1 | import "slices" |
7. 嵌入与接口的组合
1 | type Reader interface { |
8. 多态实战:策略模式
1 | type PaymentStrategy interface { |
9. 实战:等价于 Java equals/hashCode
Go 没有 equals/hashCode,但可以用接口实现:
1 | type Equaler interface { |
实际生产用 map[string]struct{} 就行,不需要自己写 hash。
小结
| 概念 | Java/C++ | Go |
|---|---|---|
| 类 | class |
struct + method |
| 继承 | extends |
嵌入(组合) |
| 接口 | implements Interface |
隐式实现(鸭子类型) |
| 多态 | 父类引用指向子类对象 | 接口变量指向任何实现者 |
| 抽象类 | abstract class |
没有,但有未导出的 struct 嵌入 |
核心思想:
- 组合优于继承:用结构体嵌入而不是 class 继承
- 小接口:Go 社区推崇”小而美的接口”(如
io.Reader只有Read一个方法) - 接受接口,返回结构体:函数参数用接口类型,返回值用具体类型
下一节讲 Go 的函数与闭包(一等公民的函数)。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/08/29/Go-04-结构体、方法与接口/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!