Menu
CoddyTech

Struct lồng nhau

Thuộc phần Kiến thức nền tảng trong hành trình GO của Coddy. Bài học 99 trên 109.

Go cho phép bạn nhúng một struct bên trong một struct khác, tạo ra mối quan hệ kết hợp. Đây là cách Go tiếp cận tính kế thừa.

Định nghĩa hai struct, trong đó một struct được nhúng bên trong struct còn lại:

type Address struct {
    city  string
    state string
}

type Person struct {
    name string
    age  int
    Address  // struct nhúng (không có tên trường)
}

func main() {
    person := Person{
        name: "Alice",
        age: 30,
        Address: Address{city: "Portland", state: "Oregon"},
    }
    
    // Truy cập trực tiếp các trường
    fmt.Println(person.city)  // Truy cập trường nhúng
}

Kết quả cho thấy ta có thể truy cập trực tiếp vào các trường của struct được nhúng:

Portland
challenge icon

Thử thách

Người mới

Trong thử thách này, bạn sẽ luyện tập cách dùng struct nhúng (thành phần) trong Go.

Chúng ta có hai struct: Address và Person. Struct Person nên nhúng struct Address để một người có thể truy cập trực tiếp vào các trường địa chỉ.

Nhiệm vụ của bạn là hoàn thiện định nghĩa struct Person để nhúng struct Address. Các câu lệnh in trong main đã đọc trực tiếp các trường địa chỉ từ người đó (person.Street, person.City, person.ZipCode); chúng sẽ biên dịch được khi Address được nhúng.

Tự làm thử

package main

import "fmt"

// Struct Address chứa thông tin địa chỉ
type Address struct {
	Street  string
	City    string
	ZipCode string
}

// Struct Person cần nhúng struct Address
type Person struct {
	Name string
	Age  int
	// TODO: Nhúng struct Address vào đây (chỉ một dòng)
}

func main() {
	// Tạo một người mới với thông tin địa chỉ
	person := Person{
		Name: "Alice",
		Age:  30,
		Address: Address{
			Street:  "123 Main St",
			City:    "Wonderland",
			ZipCode: "12345",
		},
	}

	// In ra thông tin của người đó, bao gồm địa chỉ
	fmt.Println("Name:", person.Name)
	fmt.Println("Age:", person.Age)
	
	// In trực tiếp các trường địa chỉ từ instance person
	fmt.Println("Street:", person.Street)
	fmt.Println("City:", person.City)
	fmt.Println("ZipCode:", person.ZipCode)
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Go online