GO语言基础教程16——结构体-结构体嵌套

3,846 阅读1分钟

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

(点击进入专栏查看详细教程)