代码示例:
package main import "fmt" type Human struct { name string age int weight int } type Student struct { Human // 匿名字段,那么默认Student就包含了Human的所有字段 speciality string } func main() { // 我们初始化一个学生 mark := Student{Human{"Mark", 25, 120}, "Computer Science"} // 我们访问相应的字段 fmt.Println("His name is ", mark.name) fmt.Println("His age is ", mark.age) fmt.Println("His weight is ", mark.weight) fmt.Println("His speciality is ", mark.speciality) // 修改对应的备注信息 mark.speciality = "AI" fmt.Println("Mark changed his speciality") fmt.Println("His speciality is ", mark.speciality) // 修改他的年龄信息 fmt.Println("Mark become old") mark.age = 46 fmt.Println("His age is", mark.age) // 修改他的体重信息 fmt.Println("Mark is not an athlet anymore") mark.weight += 60 fmt.Println("His weight is", mark.weight) mark.Human = Human{"aaa", 20, 123} mark.Human.age += 10 fmt.Println(mark) }
004.struct类型
1 type声明新类型
1.1 type testInt func(int) bool // 声明了一个函数类型
1.2 type person struct //声明一个结构体类型
1.3 struct与array一样是值类型,作为参数会copy完整数据; slice、map、channel等传递的是数据的内存地址
2 初始化
2.1 顺序初始化
2.1.1 var p Person = Person{"aaa", 123}
2.2 指定参数初始化
2.2.1 p = Person{name: "test", age: 456}
2.3 new指针初始化
2.3.1 var pp *Person = new(Person)
3 匿名访问
3.1 组合关系的struct可以直接通过被继承字段访问
3.2 也可以通过struct名称访问
3.3 struct不仅仅能够将struct作为匿名字段、自定义类型、内置类型都可以作为匿名字段, 而且可以在相应的字段上面进行函数操作
3.4 允许我们去重载通过匿名字段继承的一些字段, 当然如果我们想访问重载后对应匿名类型里面的字段,可以通过匿名字段名来访问