go开发中interface和方法接收器的使用
Go 语言中的接口和方法接收器学习
Go 中的 interface 就像是一个神奇的魔法杖,能让你轻松地将不同的类型拉到同一个阵营里。与其他语言的接口不同,Go 的接口无需显式声明“我实现了你”,只要你满足了接口规定的方法,Go 就会自动认你为“接口的忠实拥护者”。这是 Go 的一种很不错的特性,让接口的使用变得轻松而灵活。
1. 接口的基本定义:让类型‘说话’
接口就像是一个“规章制度”,规定了哪些方法你必须实现。只要你完成了任务,Go 就会自动接受你作为接口的实现者。
package mainimport "fmt"// 定义接口
type Speaker interface {Speak() string
}// 定义结构体
type Person struct {Name string
}// Person 实现了 Speaker 接口
func (p Person) Speak() string {return "Hello, my name is " + p.Name
}func main() {var s Speakerp := Person{Name: "John"}s = p // Person 自动实现了 Speaker 接口fmt.Println(s.Speak()) // 输出:Hello, my name is John
}
在这个例子中,Speaker 接口要求有一个 Speak() 方法,Person 类型通过实现这个方法,Go 就自动认为 Person 实现了 Speaker 接口。
2. 方法接收器:将函数升级为方法
方法接收器就像是我们为方法设置的家庭地址。方法接收器决定了某个方法属于哪个类型。比如 func (c Counter) Increment() 中的 (c Counter)就是方法接收器,它告诉 Go ,这个 Increment方法是属于 必须要传入Counter类型!”
总结一下:函数 + 方法接收器 = 方法。
举个简单例子:
type Counter struct {Value int
}// 增加计数器
func (c *Counter) Increment() {c.Value++
}
这里,(c *Counter) 是方法接收器,它绑定了 Increment 方法,说明这个方法是作用于 Counter 类型的实例上的。
3. 接口 + 方法接收器 = 多态
接下来要说的是 Go中较为精华的部分——多态!通过接口和方法接收器的结合,你可以让不同的类型表现出相同的行为,甚至不需要它们之间有任何的继承关系。
想象一下,假设你有两个类型:MySQL 和 PostgreSQL,它们都实现了一个 Database 接口,其中 Connect() 和 Query() 方法是接口的规定。这时你就能通过接口来调用这两个数据库,而不关心它们的具体实现。
go复制代码// 定义接口
type Database interface {Connect() stringQuery(query string) string
}// MySQL 实现 Database 接口
type MySQL struct{}func (m MySQL) Connect() string {return "Connecting to MySQL..."
}func (m MySQL) Query(query string) string {return "MySQL query: " + query
}// PostgreSQL 实现 Database 接口
type PostgreSQL struct{}func (p PostgreSQL) Connect() string {return "Connecting to PostgreSQL..."
}func (p PostgreSQL) Query(query string) string {return "PostgreSQL query: " + query
}func main() {var db Database// 切换使用不同的数据库db = MySQL{}fmt.Println(db.Connect()) // 输出:Connecting to MySQL...fmt.Println(db.Query("SELECT * FROM users"))db = PostgreSQL{}fmt.Println(db.Connect()) // 输出:Connecting to PostgreSQL...fmt.Println(db.Query("SELECT * FROM products"))
}
这里,MySQL 和 PostgreSQL 都实现了 Database 接口,虽然它们之间没有任何继承关系,但你可以通过相同的接口来操作它们。这就是 Go 中的多态,虽然实现不同,行为却可以统一。
4. 接口与多态的应用场景:让程序更灵活
接口和方法接收器的组合,在实际开发中非常有用。假设你有一个系统,需要支持多个版本的数据库:一个是 MySQL,另一个是 PostgreSQL,再或者支持不同的配置版本。你可以让每个数据库类型实现相同的接口,然后在不同的场景中灵活选择。
例如,你的应用需要支持 A 版本和 B 版本的不同配置,可以根据接口来切换实现,而不需要修改复杂的代码。
go复制代码type Config interface {Setup() string
}type VersionA struct{}
type VersionB struct{}func (v VersionA) Setup() string {return "设置为版本 A"
}func (v VersionB) Setup() string {return "设置为版本 B"
}func main() {var config Config// 切换版本config = VersionA{}fmt.Println(config.Setup()) // 输出:设置为版本 A config = VersionB{}fmt.Println(config.Setup()) // 输出:设置为版本 B
}
接口和方法接收器在 Go 中,可以让我们能够在没有继承的情况下实现多态,使代码更加灵活、解耦且易于扩展。通过接口,可以在不同的类型之间共享行为,而方法接收器更像是单独设置的入参。这种设计模式特别适用于需要支持多个实现或者不同环境配置的应用场景。
详细的使用说明打算以go-zero框架为例,之后再来讲解;
相关文章:
go开发中interface和方法接收器的使用
Go 语言中的接口和方法接收器学习 Go 中的 interface 就像是一个神奇的魔法杖,能让你轻松地将不同的类型拉到同一个阵营里。与其他语言的接口不同,Go 的接口无需显式声明“我实现了你”,只要你满足了接口规定的方法,Go 就会自动认…...
vue3-tp8-Element:对话框实现
效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…...
高中数学:随机变量-正态分布
文章目录 一、连续性随机变量二、大致图像三、正态分布图像及解析式图像特点均值与方差公式正态分布各区域概率 一、连续性随机变量 二、大致图像 三、正态分布图像及解析式 图像特点 均值与方差公式 正态分布各区域概率...
游戏引擎学习第47天
仓库: https://gitee.com/mrxiao_com/2d_game 昨天我们花了一点时间来修复一个问题,但基本上是在修复这个问题的过程中,我们决定添加一个功能,那就是在屏幕上控制多个实体。所以如果我有一个手柄,我可以添加另一个角色࿰…...
Git 仓库托管教程
git远程仓库 常用的远程仓库-->托管服务:github、码云、gitlab等 github需要魔法上网,速度较慢因为在国外且仅仅支持Git,如果不是Git项目是不支持的;码云--gitee国内的代码托管平台,服务器在国内速度快一些&#…...
基于51单片机的简易时钟/定时器闹钟proteus仿真
地址: https://pan.baidu.com/s/1uez4cwZuXpchmihmRqnLEg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...
Jackson @JsonProperty 注解
1. 概述 Jackson 是一个流行的Java库,用于将Java对象转换为JSON格式以及从JSON反序列化回Java对象。一种常见的需求是在序列化为JSON或从JSON反序列化时自定义字段的命名。Jackson 的 JsonProperty 注解正好满足了这一需求。 JsonProperty 注解概览 JsonProperty…...
【Excel学习记录】02-单元格格式设置
1.单元格格式工具美化表格 单元格格式位置 选中单元格,右键→设置单元格格式 合并居中 跨越合并 字体类型、大小、颜色、填充底纹、边框 斜线 软回车:alt enter 格式刷 2.单元格数字格式 格式不影响数值,只是展示形式 日期本质也是数…...
支持自定义离线地图地理区域,查询组件及数据源功能增强,DataEase开源BI工具v2.10.3 LTS发布
2024年12月9日,人人可用的开源BI工具DataEase正式发布v2.10.3 LTS版本。 这一版本的功能变动包括:数据源方面,API数据源和Excel数据源支持对字段类型和长度进行设置;图表方面,离线类地图支持自定义地理区域设置&#…...
LF CRLF
这个提示的含义是:Git 检测到你当前的 file3.txt 文件中使用了 LF(换行符,Line Feed,\n) 作为换行符,但在你系统的 Git 配置中,指定要将其转换为 CRLF(回车换行,Carriage…...
【从零开始入门unity游戏开发之——C#篇01】理论开篇,理解什么是编程
文章目录 前言前置条件进制什么是十进制、二进制二进制有什么用?为什么计算机用二进制而不用十进制?二进制转十进制十进制转二进制二进制运算 计算机中的数据存储单位什么是编程?什么是代码?什么是编程语言?常见的编程…...
怎样提升企业网络的性能?
企业网络的稳定性和高效性直接影响员工的工作效率。以下从多维度分析了一些有效策略,帮助公司提升网络性能,营造更高效的办公环境。 1. 升级网络设备 采用性能更高的网络硬件是优化网络体验的重要基础。选择支持高吞吐量、低延迟的设备(如企业…...
1. 机器学习基本知识(2)——机器学习分类
1.4 机器学习分类 1.4.1 训练监督 1. 监督学习:已对训练数据完成标记 分类:根据数据及其分类信息来进行训练,使模型能够对新的数据进行分类 回归:给出一组特征值来预测目标数值 2. 无监督学习:没有对训练数据进行任…...
四叉树算法在游戏碰撞检测中的应用
简介 在游戏开发中,碰撞检测是一个非常重要但计算成本较高的环节。如果采用简单的暴力检测方法,需要对场景中的每个物体与其他所有物体进行碰撞检测,时间复杂度为O(n)。四叉树(Quadtree)算法通过空间划分的方式,可以显著降低碰撞…...
IDEA 打包普通JAVA项目为jar包
需求:普通java项目(有添加依赖的jar包),没有用maven管理依赖和打包,要打成jar包,包可以用“java -jar 包名” 启动程序。 讲如何打包前,先记录下普通项目的目录结构和怎么添加依赖包 1.目录结…...
Docker Compose 多应用部署 一键部署
介绍 Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。 如:springbootmysqlnginx 如果一个个去部署他会非常的麻烦,这时候可以选择Docker …...
软件架构设计——通用表单UI—未来之窗行业应用跨平台架构
.东方仙盟_小世界 {margin-top: 2%;padding: 0 3%;background: #fff; } .东方仙盟_小世界 li span {width: 55px;padding-left: 0px; }.东方仙盟_小世界 li span {display: block;position: absolute;left: 0px;padding-left: 10px;width: 55px;font-size: 16px;background-siz…...
人工智能大语言模型起源篇(二),从通用语言微调到驾驭LLM
上一篇:《人工智能大语言模型起源篇(一),从哪里开始》 (5)Howard 和 Ruder 于2018年发表的《Universal Language Model Fine-tuning for Text Classification》,https://arxiv.org/abs/1801.06…...
VBA 连续打印多个内容成PDF
VBA 连续打印多个内容成PDF Dim wb As Workbook Dim sht1 As Worksheet Set sht1 ActiveSheet PT ThisWorkbook.PathApplication.ScreenUpdating FalseApplication.DisplayAlerts FalseApplication.Calculation xlCalculationManual For i [aa2] To [ab2][ad2] iSet wb …...
9. 高效利用Excel设置归档Tag
高效利用Excel设置归档Tag 1. Excle批量新建/修改归档Tag2. 趋势记录模型批量导入归档Tag(Method1)2. 趋势记录模型批量导入归档Tag(Method2)3. 趋势记录控件1. Excle批量新建/修改归档Tag Fcatory Talk常常需要归档模拟量,对于比较大的项目工程会有成千上万个重要数据需…...
ISTA 3E-2009 全解析|相同产品集合包装综合模拟运输测试标准
前言ISTA 3E-2009 属于 ISTA 3 系列高级综合模拟性能测试,专门针对相同产品的集合包装(托盘 / 滑板单元化包装),是整托出货、工业产品、整机设备、批量规整货物最常用的运输验证标准。该标准完整模拟集合包装在物流环节的冲击、跌…...
3分钟快速掌握Cursor试用重置工具:一键解除AI编程助手限制的完整指南
3分钟快速掌握Cursor试用重置工具:一键解除AI编程助手限制的完整指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Your request has been blocked as our system has detected suspicious activity / Youve reached your trial r…...
Java编程入门科普:从“一杯咖啡”到亿万应用
在数字化时代,我们每天都在与Java打交道:刷手机时的Android APP、逛电商时的后台系统、银行转账的安全校验、甚至智能家居的控制程序,背后都有Java的身影。作为一门诞生近30年仍稳居热门的编程语言,它不仅是程序员的“入门优选”&…...
G-Helper完整指南:释放华硕笔记本潜能的轻量级控制神器
G-Helper完整指南:释放华硕笔记本潜能的轻量级控制神器 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…...
如何通过DeepEval解决LangChain应用的可观测性与评估难题
如何通过DeepEval解决LangChain应用的可观测性与评估难题 【免费下载链接】deepeval The LLM Evaluation Framework 项目地址: https://gitcode.com/GitHub_Trending/de/deepeval DeepEval作为专业的LLM评估框架,为LangChain开发者提供了从测试到生产监控的完…...
魔兽争霸3现代化修复指南:3步解决经典游戏兼容性问题
魔兽争霸3现代化修复指南:3步解决经典游戏兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还记得那个曾经风靡全球的《魔…...
工业级字符识别实战:C#结合YOLO+Tesseract实现药品批号与电子元件丝印精准校验
在工业自动化生产线上,字符识别一直是质量管控的核心环节。从药品包装的批号、有效期到电子元件的丝印型号、批次号,每一个字符的错误都可能导致严重的产品质量问题甚至安全事故。 传统的OCR方案在面对工业场景时往往力不从心:字符倾斜、背景…...
QQ音乐格式转换终极指南:如何3步将.qmc文件转为MP3/FLAC
QQ音乐格式转换终极指南:如何3步将.qmc文件转为MP3/FLAC 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾在QQ音乐下载了心爱的歌曲,却发现它…...
中兴光猫工厂模式解锁神器:zteOnu让你的网络管理权限瞬间升级
中兴光猫工厂模式解锁神器:zteOnu让你的网络管理权限瞬间升级 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 你是否曾经想过,家里的中兴光猫其实隐藏着更多高级…...
智能停车系统告别拥堵!巨有科技让景区停车畅行无忧
每逢节假日,景区停车场便成了“重灾区”——入口大排长龙、场内找位半小时、缴费排队苦不堪言。这不仅严重消耗游客耐心,更直接拉低景区口碑与运营效率。在文旅消费持续回暖的今天,停车体验已成为衡量景区服务力的关键指标。巨有科技以数据驱…...
