Go 面向对象匿名字段核心知识点Go 语言没有传统的类继承而是通过匿名字段组合实现代码复用、类似继承的效果是 Go 面向对象的核心特性。一、Go 面向对象三大特性结合匿名字段继承通过匿名字段组合实现复用已有结构体的成员和方法封装隐藏内部实现只对外提供功能通过结构体 匿名字段实现多态通过接口实现二、匿名组合匿名字段1. 什么是匿名字段定义结构体时只写类型不写字段名这个字段就是匿名字段。作用直接复用另一个结构体的所有成员字段 方法。2. 基础语法示例gopackage main import fmt // 父结构体 type Person struct { name string // 姓名 sex byte // 性别 age int // 年龄 } // 子结构体匿名字段继承 Person type Student struct { Person // 匿名字段继承Person的所有成员 id int addr string }三、匿名字段初始化重点1. 完整初始化必须指定匿名字段结构体名gofunc main() { // 方式1var 定义 var s1 Student Student{Person{mike, m, 18}, 1, bj} fmt.Println(s1 , s1) // 方式2自动推导类型 s2 : Student{Person{mike, m, 18}, 1, bj} fmt.Printf(s2 %v\n, s2) }2. 指定成员初始化gofunc main() { // 只初始化 id其他字段默认零值 s3 : Student{id: 1} fmt.Printf(s3 %v\n, s3) // 显式初始化匿名字段的部分成员 s4 : Student{Person: Person{name: mike}, id: 1} fmt.Printf(s4 %v\n, s4) }错误写法必须记住go// 编译失败匿名字段不能直接展开赋值 // s5 : Student{mike, m, 18, 1, bj}规则初始化匿名字段时必须带上外层结构体名否则编译报错。四、成员操作匿名字段继承的成员可以直接访问 / 赋值和结构体自身成员一样。gofunc main() { s1 : Student{Person{mike, m, 18}, 1, bj} // 直接访问继承的字段 fmt.Println(s1.name, s1.sex, s1.age, s1.id, s1.addr) // 直接赋值 s1.name yoyo s1.age 16 fmt.Println(s1) }五、同名字段处理就近原则如果子结构体和匿名字段结构体有同名成员默认就近原则→ 优先使用子结构体自己的成员显式调用→子结构体.匿名字段类型.字段名gotype Person struct { name string } type Student struct { Person // 匿名字段 name string // 同名字段 } func main() { var s Student // 就近原则操作 Student 的 name s.name student // 显式调用操作 Person 的 name s.Person.name person fmt.Printf(s.name %s\n, s.name) // 输出 student fmt.Printf(s.Person.name %s\n, s.Person.name) // 输出 person }六、非结构体匿名字段匿名字段可以是基本类型、自定义类型不只是结构体。go// 自定义类型 type mystr string type Student struct { Person // 结构体匿名字段 int // 基本类型匿名字段 mystr // 自定义类型匿名字段 } func main() { s : Student{int: 100, mystr: hello} fmt.Println(s.int, s.mystr) }七、结构体指针作为匿名字段使用指针类型作为匿名字段节省内存传递引用。gotype Student struct { *Person // 指针匿名字段 id int addr string } func main() { // 方式1直接初始化 s1 : Student{Person{mike, m, 18}, 666, bj} fmt.Println(s1.name) // 直接访问自动解引用 // 方式2new 分配空间 var s2 Student s2.Person new(Person) // 分配内存 s2.name yoyo s2.sex m s2.age 18 s2.id 222 s2.addr sz fmt.Println(s2) }八、核心总结Go 没有继承只有匿名字段组合实现代码复用初始化匿名字段必须写结构体类型名否则编译失败同名字段遵循就近原则显式调用需指定匿名字段类型支持结构体、基本类型、指针类型作为匿名字段是 Go 实现类似继承的唯一方式