GO语言基础教程16——结构体-结构体嵌套
GO语言基础教程16——结构体-结构体嵌套
一个结构体中可以嵌套包含另一个结构体或结构体指针。
type China struct { provinces string City Citys } type Citys struct { City1 string City2 string City3 string } func main() { p := China{ provinces : "福建", City : City{ City1 : "福州", City2 : "厦门", City3 : "泉州", }, } fmt.Println(p) }
嵌套匿名字段
type China struct { provinces string Citys //匿名字段 } type Citys struct { City1 string City2 string City3 string } func main() { var p China p.provinces = "福建" p.Citys.City1 = "福州" //匿名字段默认使用类型名作为字段名 p.City2 = "厦门 //匿名字段可以省略 fmt.Println(p) }
当访问结构体成员时会先在结构体中查找该字段,找不到再去嵌套的匿名字段中查找。
嵌套结构体的字段名冲突
嵌套结构体内部可能存在相同的字段名。在这种情况下为了避免歧义需要通过指定具体的内嵌结构体字段名。
//Address 地址结构体 type Address struct { Province string City string CreateTime string } //Email 邮箱结构体 type Email struct { Account string CreateTime string } //User 用户结构体 type User struct { Name string Gender string Address Email } func main() { var user User user.name = "likuis" user.Gender = "男" user.Address.CreateTime = "2000" //指定Address结构体中的CreateTime user.Email.CreateTime = "2000" //指定Email结构体中的CreateTime }
结构体的“继承”
Go语言中使用结构体也可以实现其他编程语言中面向对象的继承。
type Animal struct { name string } func (a *Animal) move() { fmt.Printf("%s在吃饭!\n", a.name) } type Dog struct { Feet int *Animal //通过嵌套匿名结构体实现继承 } func (d *Dog) wang() { fmt.Printf("%s不会吃饭!\n", d.name) } func main() { d := &Dog{ Feet: 4, Animal: &Animal{ name: "狗蛋", }, } d.wang() //狗蛋会汪汪汪~ d.move() //狗蛋会动! }