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() //狗蛋会动!
}