概述

Go 反对将多个构造体通过嵌套的形式,组成一个大的构造体,升高了单个构造体复杂度,同时进步了构造体之间组合的灵活性。

例子

为了省略篇幅,本大节只应用 字面量 形式初始化,new() 的初始化形式请参照 构造体 大节。

每个构造体独自初始化,最初组装

package mainimport (    "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 mainimport (    "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 mainimport (    "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. 为什么有“组合优于继承”的说法 - 知乎

分割我