Go by Example: Struct Embedding

Go hỗ trợ embedding của structs and interfaces để thể hiện liền mạch hơn _thành phần của kiểu. Điều này không nên nhầm với //go:embed, đây là lệnh Go được giới thiệu trực tiếp trong bản Go 1.16+ để nhúng các tệp và thư mục vào tệp nhị phân của ứng dụng.

package main
import "fmt"
type base struct {
    num int
}
func (b base) describe() string {
    return fmt.Sprintf("base with num=%v", b.num)
}

Một container được embeds (nhúng) a base. Một embedding giống như một trường không có tên.

type container struct {
    base
    str string
}
func main() {

Khi tạo structs với literals,chúng ta phải khởi tạo embedding rõ ràng; ở dây kiểu embedded struct đóng vai trò là tên trường.

    co := container{
        base: base{
            num: 1,
        },
        str: "some name",
    }

ví dụ co.num.

    //Chúng ta có thể truy cập trực tiếp vào các trường cơ sở của `co`,
    fmt.Printf("co={num: %v, str: %v}\n", co.num, co.str)

Ngoài ra, chúng ta có thể định nghĩa đường dẫn đầy đủ bằng cách sử dụng tên của kiểu embedded struct.

    fmt.Println("also num:", co.base.num)

container embeds base, các phương thức của base cũng trở thành phương thức của container. Ở đây, chúng ta gọi một phương thức được nhúng từ base trực tiếp từ co.

    fmt.Println("describe:", co.describe())
    type describer interface {
        describe() string
    }

Embedding structs với các phương thức có thể được sử dụng để cấp cho hiện thực của interface dựa trên structs khác. Điều này cho chúng ta thấy một container hiện thực describer interface bời vì nó embeds base.

    var d describer = co
    fmt.Println("describer:", d.describe())
}
$ go run struct-embedding.go
co={num: 1, str: some name}
also num: 1
describe: base with num=1
describer: base with num=1

Ví dụ tiếp theo: Generics.