ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 结构体嵌套 一个结构体中可以嵌套包含另一个结构体或结构体指针 访问嵌套结构体的成员变量有两种 - 结构体.嵌套结构体.成员变量 - 结构体.成员变量 (嵌套结构体之间的成员变量名一致,则不可以使用该方法) ```go // Person 是人的结构体 // Person 嵌套 Address 结构体 type Person struct { name string age int8 *Address // 匿名变量。Province Province } // Address 是地址的结构体 type Address struct { Province string City string } // NewPerson 是初始化构造 Person 结构体 func NewPerson(name string, age int8, address *Address) *Person { return &Person{ name: name, age: age, Address: address, } } func main() { p1 := NewPerson("jiaxzeng", 18, &Address{"guangdong", "guangzhou"}) fmt.Printf("p1: %#v\n", p1) fmt.Printf("Province: %#v\n", p1.Address.Province) // 省略写嵌套的结构体,也是可以获取到成员变量。 // 查找成员变量顺序:先在结构体是否存在,存在则返回。不存在的话。找(所有)嵌套结构体是否存在。存在则返回。不存在则报错。 // 如果多个嵌套结构有重发的成员变量,则需要指定使用哪个嵌套结构体 fmt.Printf("city: %#v\n", p1.City) } // 运行结果 // p1: &main.Person{name:"jiaxzeng", age:18, Address:(*main.Address)(0xc00006a020)} // Province: "guangdong", city: "guangzhou" ``` ## 结构体继承 嵌套结构体有的方法。结构体都可以调用到。例如上述代码添加两个方法,梦想的方法给 person 结构体,获奖的方法给 Address 嵌套结构体。 ```go // Person 是人的结构体 // Person 嵌套 Address 结构体 type Person struct { name string age int8 *Address // 匿名变量。Province Province } // Address 是地址的结构体 type Address struct { Province string City string } // NewPerson 是初始化构造 Person 结构体 func NewPerson(name string, age int8, address *Address) *Person { return &Person{ name: name, age: age, Address: address, } } // Dream 是 *Person 结构体的梦想方法 func (p *Person) Dream(d string) { fmt.Printf("%s 的梦想是 %s\n", p.name, d) } // Award 是 *Address 结构体的获奖方法 func (a *Address) Award() { fmt.Printf("%s获奖啦!!!\n", a.City) } func main() { p1 := NewPerson("jiaxzeng", 18, &Address{"guangdong", "guangzhou"}) p1.Dream("学好Golang语言") // Person实例化调用梦想的方法(继承Address结构体) p1.Award() } // 运行结果 // jiaxzeng 的梦想是 学好Golang语言 // guangzhou获奖啦!!! ```