尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
GO_面向对象---匿名字段
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 实现类似继承的唯一方式
RELATED

相关推荐

Development statistics for the 7.1 kernel

Development statistics for the 7.1 kernel

Linus Torvalds 如期在 6 月 14 日发布了 7.1 内核。这一开发周期带来了大量新特性,同时也迎来了大批新开发者。现在是时候按照传统,来看看 7.1 的变更都来自何处,并顺便探讨一下我们的社区整体上可能正在发生怎样的变化。本次发布合并了来自…

📅 2026/9/11 18:49:07
计算机毕业设计之基于Springboot开放式实验室预约微信小程序

计算机毕业设计之基于Springboot开放式实验室预约微信小程序

随着高校教育资源的日益紧张,开放式实验室的预约管理成为提升实验教学效率和资源利用率的关键,本研究旨在设计并实现一个基于Spring Boot的开放式实验室预约微信小程序,以优化实验室资源分配,提高实验教学的便捷性和灵活性&#x…

📅 2026/8/20 20:31:30
C++并发编程:深入理解std::future异步任务与结果获取

C++并发编程:深入理解std::future异步任务与结果获取

1. 项目概述:为什么我们需要std::future?在C的世界里,尤其是当你从基础语法迈向构建高性能、响应迅速的实际应用时,多线程编程是绕不开的一道坎。但传统的多线程模型,比如直接使用std::thread,常常伴随着一…

📅 2026/8/20 20:31:37
MORE NEWS

更多资讯

📰

CMSIS-FreeRTOS源码审计:从适配层到内核调度的嵌入式RTOS实践

做嵌入式开发这些年,我越来越觉得有一类源码值得每个 MCU 工程师静下心来从头到尾读一遍:CMSIS-FreeRTOS。尤其是用 STM32CubeMX、Keil RTE 或 ARM 官方仓库生成过工程的朋友,你们每天打开的就是这个东西,但它内部到底怎么跑起来的…

📰

运放同相与反相怎么选?从输入阻抗、偏置到噪声增益讲透

前阵子画一块光电检测板的信号调理电路,原理图出来后,同事指着一个运放级问我:这一级为什么用反相放大?信号相位在这里需要翻转吗?我当时愣了一下,然后诚实地说:其实不是因为相位,是…

📰

Duix.Avatar报SQLite3 can only bind错误?三步定位并解决

Duix.Avatar报SQLite3 can only bind错误?三步定位并解决 【免费下载链接】Duix-Avatar 🚀 Truly open-source AI avatar(digital human) toolkit for offline video generation and digital human cloning. 项目地址: https://gitcode.com/GitHub_Tre…

📰

OSI七层模型|各层级传输数据单位(详解)

很多人学不懂网络层级,核心问题就是:每层的“数据单位名词太多、容易混淆”。本文对照标准 OSI 七层表格,逐词拆解、通俗解释,不堆砌专业术语,零基础也能看懂。一、OSI七层模型标准对照表先把你看到的原版表格规整排版…

📰

Vben Admin 国际化(i18n)完全指南:从语言配置到远程语言包与自定义语言扩展

Vben Admin 国际化(i18n)完全指南:从语言配置到远程语言包与自定义语言扩展 【免费下载链接】vue-vben-admin A modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast! 项目地址: https://gitcod…

📰

基于深度学习的人脸识别签到系统开发指南

简介:基于深度学习的人脸识别签到系统毕业设计源码包,主要面向计算机相关专业正在完成课程设计、毕业设计或需要项目实战练习的学生,可帮助解决人脸识别与自动签到相结合的系统实现问题。项目在导师指导下完成并获评审98分,源码经…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬