7.2 继承

本篇学习 Go 中通过结构体嵌入复用字段与方法,并能正确访问嵌入结构体成员。

字数 458 字

继承(结构体嵌入)

概念说明

Go 没有传统面向对象里的“类继承”,常见替代方式是结构体嵌入(Embedding)。
把一个结构体匿名嵌入到另一个结构体后,外层结构体可以直接访问内层字段和方法。

语法/规则

  1. 在结构体里直接写类型名(如 People)表示匿名嵌入。
  2. 外层结构体可以通过 s.Field 直接访问嵌入结构体字段。
  3. 也可以通过完整路径访问,如 s.People.Time
  4. 嵌入结构体的方法也会“提升”到外层结构体可调用。
  5. 如果字段或方法重名,需要使用完整路径区分。

结构体嵌入示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main

import "fmt"

type People struct {
	Time string
}

func (p People) Info() {
	fmt.Println("people", p.Time)
}

type Student struct {
	People
	Name string
	Age  int
}

func (s Student) PrintInfo() {
	fmt.Printf("name:%s age:%d\n", s.Name, s.Age)
}

func main() {
	student := Student{
		People: People{
			Time: "2026-04-11 01:20",
		},
		Name: "阿斌",
		Age:  21,
	}

	student.Name = "阿斌知道"
	student.PrintInfo()
	student.Info()
	fmt.Println(student.People.Time)
	fmt.Println(student.Time)
}

输出结果:

1
2
3
4
name:阿斌知道 age:21
people 2026-04-11 01:20
2026-04-11 01:20
2026-04-11 01:20

常见错误

  1. 误把嵌入当作传统继承使用,忽略 Go 本质是组合复用。
  2. 字段或方法重名时不写完整路径,导致访问歧义。
  3. 以为外层结构体会自动覆盖内层方法行为,实际需显式定义同名方法。
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
载入天数...载入时分秒...
发表了 0 篇文章 · 发表了 46 篇笔记 · 总计 2 万 5 千字(其中笔记 25104 字)