Menu
CoddyTech

嵌套结构体

本课属于 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 中构建面向对象数据模型的基础。

challenge icon

挑战

简单

让我们构建一个员工管理系统,展示嵌套结构体如何帮助你模拟现实世界中的层级关系。你将创建一种结构,其中员工属于部门,而部门包含位置信息。

你将在两个文件中组织代码:

  • 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)
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Go 在线编译器