0Pricing
Go Academy · 课时

嵌入结构体

组合结构体

嵌入结构体 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

组合结构体

Go 没有类继承,而是提供了嵌入:将一个结构体放入另一个结构体中,且不指定字段名,从而复用其字段和方法。

匿名字段

嵌入字段只声明类型,不声明名称。其成员会提升到外层结构体中。

package main

import "fmt"

type Engine struct{ Power int }

type Car struct {
	Engine
	Brand string
}

func main() {
	c := Car{Engine: Engine{Power: 150}, Brand: "Coddy"}
	fmt.Println(c.Power, c.Brand)
}

访问提升的字段

即使 Power 属于嵌入的 Engine,您仍可以直接读取 c.Power。这就是字段提升。

完整路径仍然可用

您始终可以通过类型名称显式访问嵌入的结构体。

package main

import "fmt"

type Engine struct{ Power int }
type Car struct{ Engine }

func main() {
	c := Car{Engine{200}}
	fmt.Println(c.Engine.Power)
	fmt.Println(c.Power)
}

嵌入与命名字段

命名字段(engine Engine)要求使用 c.engine.Power。嵌入(Engine)会提升成员,因此可以写成 c.Power。嵌入表达了属于某种类型的关系。

初始化嵌入的结构体

在复合字面量中使用类型名称作为字段键。

package main

import "fmt"

type Address struct{ City string }
type User struct {
	Address
	Name string
}

func main() {
	u := User{Address: Address{City: "Istanbul"}, Name: "Mert"}
	fmt.Println(u.Name, "in", u.City)
}

多重嵌入

一个结构体可以嵌入多个类型,将它们的字段混合在一起。

package main

import "fmt"

type Timestamps struct{ Created string }
type Author struct{ Name string }
type Post struct {
	Timestamps
	Author
	Title string
}

func main() {
	p := Post{Timestamps{"today"}, Author{"Ada"}, "Hello"}
	fmt.Println(p.Title, p.Name, p.Created)
}

名称冲突

如果两个嵌入类型共享一个字段名,对该字段的引用会产生编译错误——您必须使用类型名称限定它,以消除歧义。

外层结构体的遮蔽

外层结构体中声明的字段会遮蔽同名的提升字段。对于未限定访问,外层字段优先。

package main

import "fmt"

type Base struct{ ID int }
type Item struct {
	Base
	ID int
}

func main() {
	i := Item{Base{1}, 99}
	fmt.Println(i.ID, i.Base.ID)
}

指针嵌入

您可以嵌入指针类型。其成员仍会被提升,但您必须初始化该指针,否则可能发生空指针解引用。

package main

import "fmt"

type Logger struct{ Prefix string }
type Service struct{ *Logger }

func main() {
	s := Service{Logger: &Logger{Prefix: "[svc]"}}
	fmt.Println(s.Prefix)
}

何时使用嵌入

  • 复用常见字段(时间戳、标识符)
  • 从较小的类型构建更丰富的类型
  • 避免深层嵌套和冗长的访问路径

快速检查

请测试您对结构体嵌入的了解。

回顾

您学习了结构体嵌入。

  • 匿名字段会将成员提升到外层结构体
  • 通过 c.Power 或 c.Engine.Power 访问
  • 外层字段会遮蔽提升的字段
  • 发生冲突时必须显式限定
  • 指针嵌入同样可用

常见问题解答

「嵌入结构体」课时是免费的吗?

是的 — 「嵌入结构体」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「嵌入结构体」这节课中我会学到什么?

组合结构体 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「嵌入结构体」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 嵌入结构体
  2. 嵌入接口
  3. 方法提升
  4. 组合优于继承
← 返回 Go Academy