概述

Go 支持将多个结构体通过嵌套的方式,组成一个大的结构体,降低了单个结构体复杂度,同时提高了结构体之间组合的灵活性。

例子

为了省略篇幅,本小节只使用字面量方式初始化,new()的初始化方式请参照结构体小节。

每个结构体单独初始化,最后组装

packagemain
import(
"fmt"
)
typepersonstruct{
namestring
ageint16
hobby
profession
address
}
typehobbystruct{
values[]string
}
typeprofessionstruct{
descstring
}
typeaddressstruct{
telstring
areastring
}
funcmain(){
//这里使用单个字符作为变量名称,仅仅是为了演示,实际开发中要遵守命名规范
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)
}
//$gorunmain.go
//输出如下
/**
姓名:小李
年龄:12
职业:学生
爱好:[读书羽毛球电影]
电话:123-456789
住址:XX小区1栋2单元304
省略掉嵌套的字段名,打印结果一样
姓名:小李
年龄:12
职业:学生
爱好:[读书羽毛球电影]
电话:123-456789
住址:XX小区1栋2单元304
*/

整个结构体初始化

packagemain
import(
"fmt"
)
typepersonstruct{
namestring
ageint16
hobby
profession
address
}
typehobbystruct{
values[]string
}
typeprofessionstruct{
descstring
}
typeaddressstruct{
telstring
areastring
}
funcmain(){
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)
}
//$gorunmain.go
//输出如下
/**
姓名:小李
年龄:12
职业:学生
爱好:[读书羽毛球电影]
电话:123-456789
住址:XX小区1栋2单元304
*/

打印结构体

packagemain
import(
"fmt"
)
typepersonstruct{
namestring
ageint16
hobby
profession
address
}
typehobbystruct{
values[]string
}
typeprofessionstruct{
descstring
}
typeaddressstruct{
telstring
areastring
}
funcmain(){
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)
}
//$gorunmain.go
//输出如下
/**
默认打印输出如下
{小李12{[读书羽毛球电影]}{学生}{123-456789XX小区1栋2单元304}}
打印时加上字段名
{name:小李age:12hobby:{values:[读书羽毛球电影]}profession:{desc:学生}address:{tel:123-456789area: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. 1.为什么有“组合优于继承”的说法 - 知乎 (https://www.zhihu.com/question/21862257)

联系我

Go 快速入门指南 - 嵌套结构体

发表回复