go语言的组合和嵌入傻傻分不清?
一、基本语法区别组合Composition—— 命名字段package main ​ import fmt ​ type Engine struct { Power int } ​ type Car struct { myEngine Engine // 有名字 myEngine这是普通组合 Brand string } ​ func main() { c : Car{ myEngine: Engine{Power: 100}, Brand: Toyota, } // 必须通过字段名访问 fmt.Println(c.myEngine.Power) }嵌入Embedding—— 匿名字段package main ​ import fmt ​ type Engine struct { Power int } ​ type Car struct { Engine // 没有字段名只有类型名这是嵌入 Brand string } ​ func main() { c : Car{ Engine: Engine{Power: 100}, Brand: Toyota, } // 可以直接访问嵌入类型的字段 fmt.Println(c.Power) // 等价于 c.Engine.Power fmt.Println(c.Engine.Power) // 也可以这样写 }二、方法提升Method Promotion区别这是两者最关键的区别之一。组合方法不会提升package main ​ import fmt ​ type Engine struct{} ​ func (e Engine) Start() { fmt.Println(Engine starting...) } ​ type Car struct { eng Engine // 命名字段普通组合 } ​ func main() { c : Car{eng: Engine{}} // c.Start() // ❌ 编译错误Car 没有 Start 方法 c.eng.Start() // ✅ 只能通过字段名调用 }嵌入方法自动提升package main ​ import fmt ​ type Engine struct{} ​ func (e Engine) Start() { fmt.Println(Engine starting...) } ​ type Car struct { Engine // 匿名字段嵌入 } ​ func main() { c : Car{Engine: Engine{}} c.Start() // ✅ 直接调用等价于 c.Engine.Start() c.Engine.Start() // ✅ 也可以这样写 }方法提升的本质嵌入后外层结构体仿佛拥有了内层结构体的所有方法。三、接口实现区别最实用的差异这是实际开发中最容易踩坑、也最能体现嵌入威力的地方。组合外层不会自动实现内层的接口package main ​ import fmt ​ type Starter interface { Start() } ​ type Engine struct{} ​ func (e Engine) Start() { fmt.Println(Engine started) } ​ // 普通组合 type Car struct { myEngine Engine // 命名字段 } ​ func main() { var s Starter // s Car{} // ❌ 编译错误Car 没有实现 Start() 方法 // 必须自己再写一遍 s Engine{} // ✅ 只能赋值 Engine 本身 s.Start() }嵌入外层自动实现内层的接口package main ​ import fmt ​ type Starter interface { Start() } ​ type Engine struct{} ​ func (e Engine) Start() { fmt.Println(Engine started) } ​ // 嵌入 type Car struct { Engine // 匿名字段 } ​ func main() { var s Starter s Car{} // ✅ 编译通过Car 自动实现了 Starter 接口 s.Start() // 输出Engine started }关键点嵌入时Go 编译器会自动把内层类型的方法提升到外层使得外层类型也满足这些方法对应的接口。四、方法覆盖同名方法处理嵌入时外层可以覆盖内层方法package main ​ import fmt ​ type Engine struct{} ​ func (e Engine) Start() { fmt.Println(Engine start) } ​ type Car struct { Engine } ​ // Car 自己实现了 Start()会覆盖 Engine 的 Start() func (c Car) Start() { fmt.Println(Car start with key) } ​ func main() { c : Car{} c.Start() // 输出Car start with key调用 Car 自己的 c.Engine.Start() // 输出Engine start调用嵌入的 Engine 的 }组合时不存在覆盖概念因为组合没有方法提升所以外层和内层的方法完全是独立的不存在覆盖问题。五、多重嵌入与冲突嵌入支持多重嵌入但如果两个嵌入类型有同名字段或方法会产生冲突。package main ​ type A struct { Name string } ​ type B struct { Name string // 和 A 同名字段 } ​ type C struct { A B // 嵌入 A 和 B } ​ func main() { c : C{} // c.Name hello // ❌ 编译错误Name 不明确不知道用 A.Name 还是 B.Name c.A.Name hello // ✅ 必须显式指定 c.B.Name world // ✅ }六、完整对比表格对比维度组合Composition 命名字段嵌入Embedding 匿名字段语法fieldName TypeType只有类型名没有字段名关系语义has-a有一个has-a有一个但更紧密字段访问必须通过字段名c.fieldName.Field可直接访问c.Field也可c.Type.Field方法提升❌ 不会提升外层不能直接调用内层方法✅ 自动提升外层可直接调用内层方法接口实现❌ 外层不会自动实现内层已实现的接口✅ 外层自动实现内层已实现的所有接口方法覆盖不存在覆盖概念方法独立✅ 外层可实现同名方法覆盖内层多重组合/嵌入无冲突问题同名字段/方法会产生歧义需显式指定初始化方式FieldName: ValueTypeName: ValueJSON 序列化字段名作为 JSON key嵌入类型的字段会展开到外层除非加标签使用场景松耦合、需要明确区分层次关系代码复用、快速实现接口如装饰器模式七、一句话总结组合是把一个结构体放进另一个结构体里当类型用嵌入是把一个结构体融进另一个结构体里让它共享自己的字段和方法。嵌入是 Go 语言实现组合优于继承的核心语法机制它用类似继承的语法方法提升、接口自动实现实现了组合的灵活性同时避免了继承的耦合问题。

相关新闻

最新量化工具推荐,先明确你要解决的问题

最新量化工具推荐,先明确你要解决的问题

没有编程或交易经验时,量化交易看起来像一个需要立刻找工具解决的问题。但如果核心问题没有被说清楚,工具推荐很容易变成另一个不确定选项,读者仍然不知道自己该从哪里开始。工具要跟着当前任务走初学者常把多个困难合在一起:概念…

2026/6/27 1:54:14阅读更多 →
Cryptohack 密码学挑战 Write-Up:Gram-Schmidt Algorithm

Cryptohack 密码学挑战 Write-Up:Gram-Schmidt Algorithm

1. 题目信息 挑战名称:Gram-Schmidt Algorithm 所属分类:Lattices(格理论) 难度:入门级 链接:https://cryptohack.org/challenges/lattices/ 2. 题目描述 给定一组线性无关的向量 v1,v2,v3,v4∈R4v1​…

2026/6/27 1:54:14阅读更多 →
基于DD位一致性问题的DPDK收发队列深度剖析——高性能交换机现网故障定位实战

基于DD位一致性问题的DPDK收发队列深度剖析——高性能交换机现网故障定位实战

一、现网问题:交换机在“满速运行”下的隐性丢包 某高性能交换机在压测环境中表现出一个典型异常: 端口速率稳定在 2100G 满负载PMD线程 CPU 持续 100% 运行(典型 busy poll)rte_eth_stats 显示 RX/TX 包数正常但业务侧出现间歇…

2026/6/27 1:54:14阅读更多 →
AI应用工程师 02

AI应用工程师 02

概述大模型缺陷Agent解决方案只能聊天会执行任务不会调用APITool Calling不会长期记忆Memory不会拆解任务Planning不会纠错Reflection不会跨系统操作Workflow不会自主查资料Agentic RAG不会使用软件Computer Use用户: 分析上个月销售数据Agent:Step1 调SQL工具Step2…

2026/6/27 3:14:23阅读更多 →
3D IC与3D Chiplet

3D IC与3D Chiplet

过去半个多世纪,半导体行业一直仰赖摩尔定律的平面微缩来驱动性能提升——每一代新节点都带来晶体管密度翻倍、性能提升与成本下降。然而,当制程节点推进到5nm以下时,光刻极限、互连瓶颈和热问题使得传统平面微缩的收益逐步递减。与此同时&am…

2026/6/27 3:14:23阅读更多 →
从树根到宇宙:读《第一性原理》——一场关于“回归”的认知革命

从树根到宇宙:读《第一性原理》——一场关于“回归”的认知革命

从树根到宇宙:读《第一性原理》——一场关于“回归”的认知革命 打开李善友的《第一性原理》,扉页上那句话让人过目不忘:“第一性原理,好比树木的根基,没有人会看到繁茂枝干下的树根,但它决定了树的一切。”…

2026/6/27 3:14:23阅读更多 →
C语言学习笔记 - 61.流程控制15 - 复习算法思维与程序掌握方法

C语言学习笔记 - 61.流程控制15 - 复习算法思维与程序掌握方法

一、本节学习定位本节内容是对上一节知识的回顾与方法总结,重点不是新增复杂语法,而是明确 C 语言学习中的一个核心问题:程序不是单纯由语法堆砌而成,程序设计首先依赖算法思路,其次才是用 C 语言语法表达算法。在 C 语…

2026/6/27 3:14:23阅读更多 →
2026权威榜!好用的AI智能降重工具全盘点,过审成功率直接拉满

2026权威榜!好用的AI智能降重工具全盘点,过审成功率直接拉满

2026 年 AI 论文写作工具的综合王者是 千笔AI,国内毕业全流程首选千笔AI;千笔以中文润色 降重双能与全流程闭环见长,深度适配高校规范与查重系统,AI 率控制行业领先。按需求选对工具,论文效率可提升70%-90%&#xff0…

2026/6/27 3:14:23阅读更多 →
GPT-5.6有限预览,Ornith-1.0开源编程模型比肩Opus4.8,Gemini3.5Flash原生Computer Use | 6月26日 AI日报

GPT-5.6有限预览,Ornith-1.0开源编程模型比肩Opus4.8,Gemini3.5Flash原生Computer Use | 6月26日 AI日报

💡 今日趋势速览:OpenAI CEO Altman 确认 GPT-5.6 将以有限预览方式发布,联邦政府首次对 AI 模型实施逐客户审批管控,开创政府放行先例。与此同时,开源阵营持续发力,Ornith-1.0 聚焦代理编程场景&#xff0…

2026/6/27 3:09:23阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →