当前位置: 首页 > news >正文

go结构体匿名“继承“方法冲突时继承优先顺序

在这里插入图片描述

在 Go 语言中,匿名字段(也称为嵌入字段)可以用来实现继承的效果。当你在一个结构体中匿名嵌入另一个结构体时,嵌入结构体的方法会被提升到外部结构体中。这意味着你可以直接通过外部结构体调用嵌入结构体的方法。

如果多个嵌入结构体实现了同一个接口方法,那么调用时会根据方法的定义顺序来决定调用哪个方法。具体来说,Go 语言会选择第一个定义的方法。

示例

在这里插入图片描述

假设我们有两个结构体 AB,它们都实现了同一个接口 MyInterface,然后我们在结构体 C 中匿名嵌入了这两个结构体。

package mainimport "fmt"// MyInterface 接口
type MyInterface interface {DoSomething()
}// 结构体 A
type A struct{}func (a A) DoSomething() {fmt.Println("A.DoSomething()")
}// 结构体 B
type B struct{}func (b B) DoSomething() {fmt.Println("B.DoSomething()")
}// 结构体 C 匿名嵌入了 A 和 B
type C struct {AB
}func main() {c := C{}var myInterface MyInterface = cmyInterface.DoSomething() // 输出什么?
}

输出结果

在这个例子中,调用 myInterface.DoSomething() 会输出:

A.DoSomething()

解释

在这里插入图片描述

  • 方法提升:当 C 结构体匿名嵌入了 AB 时,AB 的方法都被提升到了 C 中。
  • 方法冲突:由于 AB 都实现了 DoSomething 方法,因此 C 中会有两个同名的方法。
  • 方法选择:在 Go 语言中,当多个嵌入字段中有同名方法时,会优先选择第一个定义的方法。在这个例子中,A 是第一个被嵌入的字段,因此 ADoSomething 方法会被调用。

更多示例

为了进一步说明这一点,我们可以添加更多的嵌入字段来观察方法的选择顺序。

package mainimport "fmt"// MyInterface 接口
type MyInterface interface {DoSomething()
}// 结构体 A
type A struct{}func (a A) DoSomething() {fmt.Println("A.DoSomething()")
}// 结构体 B
type B struct{}func (b B) DoSomething() {fmt.Println("B.DoSomething()")
}// 结构体 D
type D struct{}func (d D) DoSomething() {fmt.Println("D.DoSomething()")
}// 结构体 C 匿名嵌入了 A、B 和 D
type C struct {ABD
}func main() {c := C{}var myInterface MyInterface = cmyInterface.DoSomething() // 输出什么?
}

输出结果

在这个例子中,调用 myInterface.DoSomething() 会输出:

A.DoSomething()

解释

  • 方法提升ABDDoSomething 方法都被提升到了 C 中。
  • 方法选择:由于 A 是第一个被嵌入的字段,因此 ADoSomething 方法会被优先调用。

扩展

当继承类本身也实现了对应方法时,优先使用本身实现的方法


// MyInterface 接口
type MyInterface interface {DoSomething() string
}// 结构体 A
type A struct{}func (a A) DoSomething() string {fmt.Println("A.DoSomething()")return "A"
}// 结构体 B
type B struct{}func (b B) DoSomething() string {fmt.Println("B.DoSomething()")return "B"
}// 结构体 C 匿名嵌入了 A 和 B
type C struct {AB
}func (c C) DoSomething() string {fmt.Println("C.DoSomething()")return "C"
}func TestEnhanceStrcutC(t *testing.T) {var baseC C// 这里将会调用func (c C) DoSomething() stringif "C" != baseC.DoSomething() {t.Error("DoSomething failed.")}
}

总结

在 Go 语言中,当一个结构体匿名嵌入了多个实现相同接口的结构体时,调用该接口方法时会优先选择自己实现的方法,如果自己没有实现该方法,就按照顺序从上到下找到第一个定义的方法。方法的定义顺序决定了调用哪个方法。但是为了避免歧义和提高代码的可读性,建议在设计时尽量避免这种情况,或者在外部结构体中显式地实现接口方法。

相关文章:

go结构体匿名“继承“方法冲突时继承优先顺序

在 Go 语言中,匿名字段(也称为嵌入字段)可以用来实现继承的效果。当你在一个结构体中匿名嵌入另一个结构体时,嵌入结构体的方法会被提升到外部结构体中。这意味着你可以直接通过外部结构体调用嵌入结构体的方法。 如果多个嵌入结…...

【049】基于51单片机语音录放【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成:51单片机最小系统ISD4004语音芯片LM386音频放大器喇叭LCD1602液晶显示按键控制LED灯。 1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片,LCD1602液晶显示屏实时显示; 2、系统具有两种模式:录音…...

《软件项目管理》期末-复习题及参考答案

(1)赶工一个任务时,你应该关注( C ) A. 尽可能多的任务 B. 非关键任务 C. 加速执行关键路径上的任务 D. 通过成本最低化加速执行任务 (2)下列哪个不是项目管理计划的一部分?&#x…...

milvus 通俗易懂原理

向量值如何生成的 Milvus 是一个开源的向量数据库,专门用于处理高维向量的存储、搜索和分析。向量值本身通常来自于某些机器学习或深度学习模型的输出,尤其是在自然语言处理(NLP)、计算机视觉(CV)、推荐系…...

什么是撞库、拖库和洗库?

“撞库”是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。 很多用户在不同网站使用的是相同的帐号密码,因此黑客可以通过获取用户在A网站的账户从而尝试登录B网…...

安卓-碎片的使用入门

1.碎片(Fragment)是什么 Fragment是依赖于Activity的,不能独立存在的,是Activity界面中的一部分,可理解为模块化的Activity,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛. Fragment不能独立存在,必须…...

华为IPD流程学习之——深入解读123页华为IPD流程体系设计方法论PPT

该方案全面介绍了华为IPD流程体系设计方法论,包括流程体系建设的背景、理念、架构、核心特征、构建模型、与组织和战略的关系、运营机制、数字化转型以及流程管理组织等内容,旨在为企业提供一套系统的流程体系建设指导,以提升运营效率、质量和…...

DriveMLLM:一个专为自动驾驶空间理解任务设计的大规模基准数据集

2024-11-20, 由武汉大学、中国科学院自动化研究所、悉尼科技大学、牛津大学等合创建了DriveMLLM数据集,该数据集是自动驾驶领域首个专为评估多模态大型语言模型(MLLMs)空间理解能力而设计的基准,对于推动自动驾驶技术的…...

高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)

引言 在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲…...

python的函数与递归

需求: 编写一个函数,计算斐波那契数列的第 N 项,并使用递归实现。 为了计算斐波那契数列的第 N 项,可以使用递归方法。斐波那契数列的定义是: F(0) 0 F(1) 1 对于 n > 2,F(n) F(n-1) F(n-2)&#xf…...

RabbitMQ学习-Seven

再SpringBoot中使用MQ 1.创建SpringBoot项目 除了我们平常使用的一些工具依赖,还需要选择这个Spring for RabbitMQ依赖 2.需要在application.yml文件中进行配置 server:port :9090 spring:application:name:producerrabbitmq:host: 你的主机名port: 5672virtual-…...

中科亿海微SoM模组——波控处理软硬一体解决方案

本文介绍的波控处理软硬一体解决方案主要是面向相控阵天线控制领域,波控处理通过控制不同天线组件的幅相来调整天线波束的方向和增益,实现高精度角度控制和高增益。本方案由波控处理板、波控处理控制软件算法和上位机软件共同构成。波控处理SoM模组原型样…...

开源法律、政策和实践

#一切皆可开源# 木兰社区对《Open Source Law,Policy and Practice 》这本书的第二版进行了翻译,并发布在了gitee上。这本书是对开源文化、开源政策、法律的全面介绍。目录如下: 1 Open Source as Philosophy,Methodology,and CommerceUsing Law with …...

【计算视觉算法与应用】金字塔,下采样Gaussian Pyramid. 上采用 Laplacian Pyramid (code: py)

金字塔(Pyramid)在图像处理中主要用于多尺度分析和图像压缩。常见的图像金字塔有两种: 高斯金字塔(Gaussian Pyramid):用于下采样图像,生成分辨率逐渐降低的图像序列。拉普拉斯金字塔&#xff…...

基于BERT的语义分析实现

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

DNS查询工具

DNS查询工具是用于查询和获取域名相关信息的工具。通过这些工具,您可以获取到诸如IP地址、邮件服务器以及域名服务器等信息,这对于排查问题、设置域名配置以及确保网站正常运行都非常重要。 以下是五款常用的DNS记录查询工具: MxToolbox MxTo…...

ODB 框架

目录 概述 基本工作原理 映射C对象到数据库表 从数据库中加载对象 持久化C对象到数据库 ODB常用接口 表创建预处理 #pragma db Object table 数据表属性 id auto column(“xxx”) type("xxx") unique index null default&…...

Ubuntu WiFi检测

ubuntu检测到多个同名wifi,怎么鉴别假冒的wifi? 在Ubuntu中,如果检测到多个同名的Wi-Fi网络,可能存在假冒的Wi-Fi(例如“蜜罐”攻击)。以下是一些鉴别假冒Wi-Fi的方法: 检查信号强度&#xff1a…...

QILSTE H4-108TCG高亮纯lu光LED灯珠 发光二极管LED

型号:H4-108TCG 在电子领域,H4-108TCG LED以其卓越的性能和微小的尺寸1.6x0.8x0.4mm脱颖而出。这款高亮纯绿光LED,采用透明平面胶体,符合EIA标准包装,是环保产品,符合ROHS标准。防潮等级为Level 3&#xf…...

IP与“谷子”齐飞,阅文“乘势而上”?

爆火的“谷子经济”,又捧出一只“潜力股”。 近日,阅文集团股价持续上涨,5日累计涨幅达13.20%。这其中,周三股价一度大涨约15%至29.15港元,强势突破20日、30日、120日等多根均线,市值突破280亿港元关口。 …...

Java阶段三05

第3章-第5节 一、知识点 动态代理、jdk动态代理、cglib动态代理、AOP、SpringAOP 二、目标 理解什么是动态代理和它的作用 学会使用JAVA进行动态代理 理解什么是AOP 学会使用AOP 理解什么是AOP的切入点 三、内容分析 重点 理解什么是动态代理和它的作用 理解什么是AO…...

C# yield 关键字

文章目录 前言一、yield 关键字的语法形式及使用场景(一)yield return(二)yield break 二、yield 关键字的工作原理三、yield 关键字的优势与应用场景(一)优势(二)应用场景 前言 在 …...

SpringBoot开发——结合Nginx实现负载均衡

文章目录 负载均衡介绍介绍Nginx实现负载均衡的示例图:负载均衡策略1.Round Robin:2.Least Connections:3.IP Hash :4.Generic Hash:5.Least Time (NGINX Plus only)6.Random:Nginx+SpringBoot实现负载均衡环境准备Nginx 配置负载均衡测试负载均衡介绍 介绍 在介绍Nginx的负…...

RabbitMQ在手动消费的模式下设置失败重新投递策略

最近在写RabbitMQ的消费者,因为业务需求,希望失败后重试一定次数,超过之后就不处理了,或者放入死信队列。我这里就达到重试次数后就不处理了。本来以为很简单的,问了kimi,按它的方法配置之后,发…...

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前,TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore,完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…...

【Linux】线程池设计 + 策略模式

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 线程池 1-1 ⽇志与策略模式1-2 线程池设计1-3 线程安全的单例模式1-3-1 什么是单例模式1-3-2 单例模式的特点1-3-3 饿汉实现⽅式和懒汉实现⽅式1-3-4 饿汉…...

网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识

目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…...

Python-链表数据结构学习(1)

一、什么是链表数据? 链表是一种通过指针串联在一起的数据结构,每个节点由2部分组成,一个是数据域,一个是指针域(存放下一个节点的指针)。最后一个节点的指针域指向null(空指针的意思&#xff0…...

性能优化经验:关闭 SWAP 分区

关闭 SWAP 分区,特别是在性能敏感场景(如 Elasticsearch 服务)中,主要与 SWAP 的工作机制和对应用性能的影响有关。以下是详细原因: 1. SWAP 的工作机制导致高延迟 SWAP 是什么: SWAP 分区是系统将物理内存…...

SpringBoot小知识(2):日志

日志是开发项目中非常重要的一个环节,它是程序员在检查程序运行的手段之一。 1.日志的基础操作 1.1 日志的作用 编程期调试代码运营期记录信息: * 记录日常运营重要信息(峰值流量、平均响应时长……) * 记录应用报错信息(错误堆栈) * 记录运维过程数据(…...

可以免费做推广的网站/广告推广软文案例

Node.js下载地址Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/最新版本为Node.js v12.16.1 LTS,你根据不同的平台系统选择需要的Node.js 安装包。 如下图所示:在Windows系统上安装Node首先双击下载好的安装包node-v12.16.…...

网站换域名了怎么做301重定向/外贸接单十大网站

IAP15F2K61S2 系列单片机提供了 14 个中断请求源,它们分别是:外部中断 0(INT0)、定时器 0 中断、外部中断 1(INT1)、定时器 1 中断、串口 1 中断、ADC 中断、低压检测(LVD)中断、CCP…...

武汉设计工程学院官网/网站seo推广招聘

Opera 兼容 Media Player 不是很好,但是很多网站上的音乐就要用Media Player 播放!其实解决办法还是有滴从网上下载np-mswmp.dll文件放在 OPERA_Install_HOME\\program\plugins 中重启opera 软件!完工! 转载于:https://www.cnblogs.com/story…...

网站初期如何推广的/网店推广实训报告

注意:似乎直接点链接不开,把链接粘贴到地址栏打开 谁推荐的入门教程 http://dataunion.org/19325.html 谁写的在Windows下编译CAFFE并使用其matlab和python接口: http://blog.csdn.net/happynear/article/details/45372231 谁发布的不需自己编译而…...

做30个精品网站/哈尔滨seo关键词排名

文章首发于我的公众号:hindydesign转载请注明出处,感谢您对作者版权的尊重前言最近发现自己一直在忙着工作的事,个人的学习与成长变得缓慢了许多,有些许焦虑。我希望能更加了解作为 UI 设计师的自己,能更加知道自己想走…...

在什么网站做兼职/广西壮族自治区人民医院

文章目录Vue之 - 基本的代码结构和插值表达式Vue之 v-cloakVue指令之v-text和v-htmlVue指令之v-bind的三种用法Vue指令之v-on跑马灯效果Vue指令之v-on的缩写和事件修饰符使用.stop 阻止冒泡使用.capture 实现捕获触发事件的机制使用 .prevent 阻止默认行为使用 .self 实现只有点…...