1.结构体内嵌套匿名结构体(访问相同字段)

当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段以及方法(指绑定在这个类型上的,见最后)都被隐式地引入了当前定义的这个struct;
如果human里面有一个字段叫做phone,而student也有一个字段叫做phone,那么该怎么办呢?
Go语言很简单地解决了这个问题,最外层的优先访问,也就是当你通过student.phone访问的时候,是访问student里面的字段,而不是human里面的字段;
这样就允许我们去重载通过匿名字段继承的一些字段,当然如果我们想访问重载后对应匿名类型里面的字段,可以通过匿名字段名来访问;
结构体默认采用类型名作为字段名,结构体要求字段名必须唯一,因此结构体中同种类型的匿名字段只能有一个

image-20220127161707928

type Human struct {
	name       string
	age        int
	weight     int
	speciality string
}
type Student struct {
	Human      // 匿名字段,那么默认Student就包含了Human的所有字段
	speciality string
}

func main() {
	// 我们初始化一个学生
	mark := Student{Human{"Mark", 25, 120, "222222222222"}, "11111111"}
	fmt.Println(mark)
	fmt.Println(mark.Human) //{Mark 25 120 222222222222}
	// 我们访问相应的字段
	fmt.Println(mark.name) //Mark

	fmt.Println(mark.speciality)       //11111111
	fmt.Println(mark.Human.speciality) //222222222222

	//修改
	mark.speciality = "3333333"

	fmt.Println(mark.speciality) //3333333
	//以上的说明:匿名字段就是这样,能够实现字段的继承;以下说明student还能访问Human这个字段作为字段名
	mark.Human = Human{"Marcus", 55, 220, "00000000000"}
}

2.结构体内嵌套匿名结构体(访问相同方法)

type Human struct {
	name string
}
type Student struct {
	Human
	speciality string
}

func (s Student) demo1() {
	fmt.Println("ssssssssssssss")
}
func (h Human) demo1() {
	fmt.Println("hhhhhhhhhh")
}
func (h Human) demo2() {
	fmt.Println("-----------------")
}

func main() {
	a := Student{}

	a.demo1() //ssssssssssssss

	a.demo2()       //---------------
	a.Human.demo1() //hhhhhhhhh
}

3.结构体嵌套匿名自定义类型

通过匿名访问和修改字段很有用,但不仅仅是struct字段,所有的内置类型和自定义类型都可以作为匿名字段

type Skills []string

type Student struct {
	Skills     // 匿名字段,自定义的类型string slice
	speciality string
}

func main() {
	// 初始化学生Jane
	jane := Student{Skills: []string{"111", "ds"}, speciality: "Biology"}
	fmt.Println(jane.Skills) //[111 ds]

	jane.Skills = []string{"anatomy"} 
	fmt.Println(jane.Skills)         //[anatomy]
}

4.结构体嵌套匿名内置类型

type Student struct {
	int        // 内置类型作为匿名字段
	speciality string
}

func main() {
	// 初始化学生Jane
	jane := Student{int: 4, speciality: "Biology"}
	fmt.Println(jane.int) //4

	jane.int = 8888
	fmt.Println(jane.int) //8888
}

5.结构体嵌套任意类型匿名指针


type a []string
type B struct {
	a int8
	b int32
}

type A struct {
	name string
	*int
	*a 
	* B
}



func main() {
	
}

6.匿名结构体的应用-----继承

image-20220127161927143
image-20220127161944351