概述

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

例子

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

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

packagemainimport("fmt")typepersonstruct{namestringageint16hobbyprofessionaddress}typehobbystruct{values[]string}typeprofessionstruct{descstring}typeaddressstruct{telstringareastring}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*/

整个结构体初始化

packagemainimport("fmt")typepersonstruct{namestringageint16hobbyprofessionaddress}typehobbystruct{values[]string}typeprofessionstruct{descstring}typeaddressstruct{telstringareastring}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*/

打印结构体

packagemainimport("fmt")typepersonstruct{namestringageint16hobbyprofessionaddress}typehobbystruct{values[]string}typeprofessionstruct{descstring}typeaddressstruct{telstringareastring}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)

联系我

业精于勤,荒于嬉;行成于思,毁于随。