嵌套结构体
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 16 课,共 107 课。
嵌套结构体是指其中一个字段包含另一个命名结构体的结构体。这样,你就可以通过组合较小的可复用类型来表示复杂的层级数据。
type Address struct {
Street string
City string
ZIP string
}
type Person struct {
Name string
Age int
Address Address // 嵌套结构体
}要访问嵌套结构体中的字段,可以用点号连接字段名。
p := Person{
Name: "Alice",
Age: 30,
Address: Address{
Street: "123 Main St",
City: "Boston",
ZIP: "02101",
},
}
fmt.Println(p.Address.City) // Boston嵌套有助于复用代码。Address 类型可以用于 Person、Company 或 Order 等多个结构体中,而不必重复定义字段。这种做法反映了现实世界中的关系,其中一个实体可以包含其他实体。
type Company struct {
Name string
Employees int
Address Address // 复用了相同的 Address 类型
}你可以将结构体嵌套多层,不过保持层级较浅有助于提高可读性。嵌套结构体是 Go 中构建面向对象数据模型的基础。
挑战
简单让我们构建一个员工管理系统,展示嵌套结构体如何帮助你模拟现实世界中的层级关系。你将创建一种结构,其中员工属于部门,而部门包含位置信息。
你将在两个文件中组织代码:
models.go:定义三个协同工作的结构体:Location,包含Building(字符串)和Floor(整数)字段Department,包含Name(字符串)和一个嵌套的Location字段Employee,包含ID(整数)、Name(字符串)和一个嵌套的Department字段
main.go:从输入中读取员工信息,使用正确嵌套的结构体创建一个 Employee,并通过访问嵌套结构中的字段来显示完整的员工档案。
将提供以下输入:
- 第 1 行:员工 ID(整数)
- 第 2 行:员工姓名
- 第 3 行:部门名称
- 第 4 行:楼宇名称
- 第 5 行:楼层编号(整数)
输出格式:
Employee: [Name] (ID: [ID])
Department: [DepartmentName]
Location: [Building], Floor [Floor]例如,给定 101、Alice Chen、Engineering、Tower A 和 5,你的输出应为:
Employee: Alice Chen (ID: 101)
Department: Engineering
Location: Tower A, Floor 5使用点号表示法,沿着结构体层级逐层访问嵌套字段(例如,employee.Department.Location.Building)。
亲手试试
package main
import "fmt"
func main() {
// 读取员工信息
var id int
var name string
var deptName string
var building string
var floor int
fmt.Scanln(&id)
fmt.Scanln(&name)
fmt.Scanln(&deptName)
fmt.Scanln(&building)
fmt.Scanln(&floor)
// TODO: 创建一个正确嵌套结构体的 Employee
// 使用 models.go 中的 Location、Department 和 Employee 结构体
// 用输入值初始化所有嵌套字段
// TODO: 按以下格式输出员工资料:
// 员工:[Name](ID:[ID])
// 部门:[DepartmentName]
// 位置:[Building],楼层 [Floor]
// 使用点号访问嵌套字段(例如 employee.Department.Location.Building)
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Go 在线编译器