網頁

2021/7/8

Golang struct嵌入欄位 embedded field

Go語言的struct中無命名而只有型態的屬性稱為embedded field。


例如下面定義一個Employee struct,其兩個屬性只有型態但沒名稱,所以都是embedded field。Embedded fields的型態名稱即為存取名稱。

package main

import (
    "fmt"
    "strconv"
)

type Employee struct {
    int
    string
}

func main() {
    employee := Employee{1, "John"}
    fmt.Println(employee) // {1 John}
    fmt.Println(employee.string) // John
}

Embedded field的屬性(field)或方法(method)又稱為promoted fields或promoted methods。因為embedded field的屬性或方法能直接被所屬的struct引用。

例如下面EmployeeManager的embedded field,則Employee的屬性及方法都能被Manager直接引用,看起來像是被往上晉升了(promoted),但promoted fields/methods實際上仍屬於原本的embedded field type。

package main

import (
    "fmt"
)

type Employee struct {
    Id   int
    Name string
    Age  int
}

func (e Employee) ReportAge() {
    fmt.Printf("%s is %d years old.\n", e.Name, e.Age)
}

type Manager struct {
    Employee
    Title string
}

func main() {
    manager := Manager{Employee{1, "John", 33}, "CTO"}
    fmt.Println(manager.Age) // 33

    manager.Age = 44
    fmt.Println(manager.Age) // 44

    manager.ReportAge() // John is 44 years old.
}

Go並沒有物件導向程式如Java的繼承設計,而是透過嵌入欄位來達到類似效果。所以上面的Manager就像是"繼承"了Employee的特性。


沒有留言:

張貼留言