Menu
CoddyTech

嵌入结构体

本课属于 Coddy GO 学习旅程的“基础知识”单元。第 99 课,共 109 课。

Go 允许你将一个结构体嵌入另一个结构体中,从而创建组合关系。这是 Go 实现继承的方式。

定义两个结构体,其中一个嵌入另一个结构体中:

type Address struct {
    city  string
    state string
}

type Person struct {
    name string
    age  int
    Address  // 嵌入的结构体(没有字段名)
}

func main() {
    person := Person{
        name: "Alice",
        age: 30,
        Address: Address{city: "Portland", state: "Oregon"},
    }
    
    // 直接访问字段
    fmt.Println(person.city)  // 访问嵌入的字段
}

输出显示,我们可以直接访问嵌入式结构体的字段:

Portland
challenge icon

挑战

入门

在这个挑战中,你将练习在 Go 中使用嵌入式结构体(组合)。

我们有两个结构体:Address 和 Person。Person 结构体应嵌入 Address 结构体,这样就可以直接访问地址字段。

你的任务是完成 Person 结构体定义,将 Address 结构体嵌入其中。main 中的打印语句已经直接从 person 读取地址字段(person.Street、person.City、person.ZipCode);嵌入 Address 后,这些语句就能编译通过。

亲手试试

package main

import "fmt"

// Address 结构体包含地址信息
type Address struct {
	Street  string
	City    string
	ZipCode string
}

// Person 结构体应嵌入 Address 结构体
type Person struct {
	Name string
	Age  int
	// TODO:在这里嵌入 Address 结构体(只需一行)
}

func main() {
	// 创建一个包含地址信息的新 person
	person := Person{
		Name: "Alice",
		Age:  30,
		Address: Address{
			Street:  "123 Main St",
			City:    "Wonderland",
			ZipCode: "12345",
		},
	}

	// 输出 person 的信息,包括地址
	fmt.Println("Name:", person.Name)
	fmt.Println("Age:", person.Age)
	
	// 直接从 person 实例中输出地址字段
	fmt.Println("Street:", person.Street)
	fmt.Println("City:", person.City)
	fmt.Println("ZipCode:", person.ZipCode)
}
quiz icon自我测试

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

基础知识中的所有课

自己练习: Go 在线编译器