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