章节

7.2 结构体嵌入

本篇学习 Go 中通过结构体嵌入实现组合复用,并能正确访问嵌入结构体成员。

结构体嵌入

概念说明

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 // 匿名嵌入 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 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字