概述 Go 支持將多個結構體通過嵌套的方式,組成一個大的結構體,降低了單個結構體複雜度,同時提高了結構體之間組合的靈活性。 例子 為了省略篇幅,本小節只使用 字面量 方式初始化,new() 的初始化方式請參照 結構體 小節。 每個結構體單獨初始化,最後組裝 package main import ( ...
概述
Go 支持將多個結構體通過嵌套的方式,組成一個大的結構體,降低了單個結構體複雜度,同時提高了結構體之間組合的靈活性。
例子
為了省略篇幅,本小節只使用 字面量
方式初始化,new()
的初始化方式請參照 結構體 小節。
每個結構體單獨初始化,最後組裝
package main
import (
"fmt"
)
type person struct {
name string
age int16
hobby
profession
address
}
type hobby struct {
values []string
}
type profession struct {
desc string
}
type address struct {
tel string
area string
}
func main() {
// 這裡使用單個字元作為變數名稱,僅僅是為了演示,實際開發中要遵守命名規範
h := hobby{
values: []string{"讀書", "羽毛球", "電影"},
}
p := profession{
desc: "學生",
}
a := address{
tel: "123-456789",
area: "XX 小區 1 棟 2 單元 304",
}
li := person{
name: "小李",
age: 12,
hobby: h,
profession: p,
address: a,
}
fmt.Printf(" 姓名: %s\n 年齡: %d\n 職業: %s\n 愛好: %v\n 電話: %s\n 住址: %s\n",
li.name, li.age, li.profession.desc, li.hobby.values, li.address.tel, li.area)
// 其中,嵌套的欄位名可以省略
fmt.Println("\n 省略掉嵌套的欄位名,列印結果一樣\n")
fmt.Printf(" 姓名: %s\n 年齡: %d\n 職業: %s\n 愛好: %v\n 電話: %s\n 住址: %s\n",
li.name, li.age, li.desc, li.values, li.tel, li.area)
}
// $ go run main.go
// 輸出如下
/**
姓名: 小李
年齡: 12
職業: 學生
愛好: [讀書 羽毛球 電影]
電話: 123-456789
住址: XX 小區 1 棟 2 單元 304
省略掉嵌套的欄位名,列印結果一樣
姓名: 小李
年齡: 12
職業: 學生
愛好: [讀書 羽毛球 電影]
電話: 123-456789
住址: XX 小區 1 棟 2 單元 304
*/
整個結構體初始化
package main
import (
"fmt"
)
type person struct {
name string
age int16
hobby
profession
address
}
type hobby struct {
values []string
}
type profession struct {
desc string
}
type address struct {
tel string
area string
}
func main() {
li := person{
name: "小李",
age: 12,
hobby: hobby{
values: []string{"讀書", "羽毛球", "電影"},
},
profession: profession{
desc: "學生",
},
address: address{
tel: "123-456789",
area: "XX 小區 1 棟 2 單元 304",
},
}
fmt.Printf(" 姓名: %s\n 年齡: %d\n 職業: %s\n 愛好: %v\n 電話: %s\n 住址: %s\n",
li.name, li.age, li.desc, li.values, li.tel, li.area)
}
// $ go run main.go
// 輸出如下
/**
姓名: 小李
年齡: 12
職業: 學生
愛好: [讀書 羽毛球 電影]
電話: 123-456789
住址: XX 小區 1 棟 2 單元 304
*/
列印結構體
package main
import (
"fmt"
)
type person struct {
name string
age int16
hobby
profession
address
}
type hobby struct {
values []string
}
type profession struct {
desc string
}
type address struct {
tel string
area string
}
func main() {
li := person{
name: "小李",
age: 12,
hobby: hobby{
values: []string{"讀書", "羽毛球", "電影"},
},
profession: profession{
desc: "學生",
},
address: address{
tel: "123-456789",
area: "XX 小區 1 棟 2 單元 304",
},
}
fmt.Println("預設列印輸出如下")
fmt.Println(li)
fmt.Println("列印時加上欄位名")
fmt.Printf("%+v\n", li)
fmt.Println("列印時加上嵌套欄位名")
fmt.Printf("%#v\n", li)
}
// $ go run main.go
// 輸出如下
/**
預設列印輸出如下
{小李 12 {[讀書 羽毛球 電影]} {學生} {123-456789 XX 小區 1 棟 2 單元 304}}
列印時加上欄位名
{name:小李 age:12 hobby:{values:[讀書 羽毛球 電影]} profession:{desc:學生} address:{tel:123-456789 area:XX 小區 1 棟 2 單元 304}}
列印時加上嵌套欄位名
main.person{name:"小李", age:12, hobby:main.hobby{values:[]string{"讀書", "羽毛球", "電影"}}, profession:main.profession{desc:"學生"}, address:main.address{tel:"123-456789", area:"XX 小區 1 棟 2 單元 304"}}
*/
擴展閱讀
- 1. 為什麼有“組合優於繼承”的說法 - 知乎 (https://www.zhihu.com/question/21862257)