嵌入结构体
组合结构体
嵌入结构体 是 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 反馈 — 无需本地设置。