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中较为精华的部分——多态!通过接口和方法接收器的结合,你可以让不同的类型表现出相同的行为,甚至不需要它们之间有任何的继承关系。

想象一下,假设你有两个类型:MySQLPostgreSQL,它们都实现了一个 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"))
}

这里,MySQLPostgreSQL 都实现了 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框架为例,之后再来讲解;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/491668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构day5:单向循环链表 代码作业

一、loopLink.h #ifndef __LOOPLINK_H__ #define __LOOPLINK_H__#include <stdio.h> #include <stdlib.h>typedef int DataType;typedef struct node {union{int len;DataType data;};struct node* next; }loopLink, *loopLinkPtr;//创建 loopLinkPtr create();//…

利用CNN与多尺度特征、注意力机制的融合实现低分辨率人脸表情识别,并给出模型介绍与代码实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下利用CNN与多尺度特征、注意力机制的融合实现低分辨率人脸表情识别&#xff0c;并给出模型介绍与代码实现。在当今社会&#xff0c;人脸识别技术已广泛应用&#xff0c;但特定场景下的低质量图像仍是一大挑战。 低分…

Scala—“==“和“equals“用法(附与Java对比)

Scala 字符串比较—""和"equals"用法 Scala 的 在 Scala 中&#xff0c; 是一个方法调用&#xff0c;实际上等价于调用 equals 方法。不仅适用于字符串&#xff0c;还可以用于任何类型&#xff0c;并且自动处理 null。 Demo&#xff1a; Java 的 在 J…

驱动开发-入门【1】

1.内核下载地址 Linux内核源码的官方网站为https://www.kernel.org/&#xff0c;可以在该网站下载最新的Linux内核源码。进入该网站之后如下图所示&#xff1a; 从上图可以看到多个版本的内核分支&#xff0c;分别为主线版本&#xff08;mainline&#xff09;、稳定版本&#…

Android Room 数据库使用详解

一、Room介绍 Android Room 是 Google 提供的一个 Android 数据持久化库&#xff0c;是 Android Jetpack 组成部分之一。它提供了一个抽象层&#xff0c;使得 SQLite 数据库的使用更为便捷。通过 Room&#xff0c;开发者可以轻松地操作数据库&#xff0c;不需要直接编写繁琐的…

使用k6进行Redis基准测试

1.安装环境 前提条件&#xff1a;已经安装go 安装xk6 go install go.k6.io/xk6/cmd/xk6latest 安装成功会在GOPATH目录生成xk6可执行文件 安装xk6-redis 切换到xk6工作目录&#xff0c;执行如下命令 cd /Users/wan/go/bin ./xk6 build --with github.com/grafana/xk6-re…

【期末复习】JavaEE(上)

1. Java EE概述 开发环境及开发工具 1.1. HTTP协议 开发模式 2. Java Web技术 JSP技术 2.1. Servlet技术 2.1.1. HttpServletRequest 常用方法 2.1.2. HttpServletRequest 请求乱码 tomcat7 及以下&#xff08;对于每个参数单独进行编码转换&#xff09;&#xff1a; 2.…

KeyFormer:使用注意力分数压缩KV缓存

Keyformer: KV Cache Reduction through Key Tokens Selection for Efficient Generative Inference 202403&#xff0c;发表在Mlsys Introduction 优化KV cache的策略&#xff0c;主要是集中在系统级别的优化上&#xff0c;比如FlashAttention、PagedAttention&#xff0c;它…

Win11安装安卓子系统WSA

文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA&#xff1a;Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store&#xff0c;下拉框改为 …

PHP排序算法:数组内有A~E,A移到C或者C移到B后排序,还按原顺序排序,循环

效果 PHP代码 public function demo($params){function moveNext($arr){$length count($arr);$lastElement $arr[$length - 1];for ($i $length - 1; $i > 0; $i--) {$arr[$i] $arr[$i - 1];}$arr[0] $lastElement;return $arr;}function moveAndReplace($array, $from…

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园

目录 [[数字花园]]的构建原理包括三个步骤&#xff1a;五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园&#xff08;在线个人知识库&#xff09;的经历&#xff0c;首先尝试的是网上普遍使用的方法&#xff0c;也就是本篇文章介绍的。 后面会继续…

el-table表格嵌套子表格:展开所有内容;对当前展开行内容修改,当前行默认展开;

原文1 原文2 原文3 一、如果全部展开 default-expand-all"true" 二、设置有数据的行打开下拉 1、父table需要绑定两个属性expand-row-key和row-key <el-table:data"tableData":expand-row-keys"expends" //expends是数组&#xff0c;设置…

区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测。QRDNN模型…

用.Net Core框架创建一个Web API接口服务器

我们选择一个Web Api类型的项目创建一个解决方案为解决方案取一个名称我们这里选择的是。Net 8.0框架 注意&#xff0c;需要勾选的项。 我们找到appsetting.json配置文件 appsettings.json配置文件内容如下 {"Logging": {"LogLevel": {"Default&quo…

扩展SpringBoot中的SpringMVC的默认配置

SpringBoot默认已经给我们做了很多SpringMVC的配置&#xff0c;哪些配置&#xff1f; 视图解析器ViewResolver静态资料的目录默认首页index.html图标名字和图标所在目录&#xff0c;favicon.ico类型转换器Converter&#xff0c;格式转换器的Formatter消息转换器HttpMessageCon…

练习题:一维数组

练习题 第一题 键盘录入一组数列&#xff0c;利用冒泡排序将数据由大到小排序 代码 #include <stdio.h>int arr_home01() {int arr[10];int i,j,temp;printf("请输入10个测试整数&#xff1a;\n");int len sizeof(arr) / sizeof(arr[0]);for(i 0;i < …

2024安装hexo和next并部署到github和服务器最新教程

碎碎念 本来打算写点算法题上文所说的题目&#xff0c;结果被其他事情吸引了注意力。其实我之前也有过其他博客网站&#xff0c;但因为长期不维护&#xff0c;导致数据丢失其实是我懒得备份。这个博客现在部署在GitHub Pages上&#xff0c;github不倒&#xff0c;网站不灭&…

【鸿睿创智开发板试用】RK3568 NPU的人工智能推理测试

目录 引言 驱动移植 例程编译 修改build.sh 执行编译 运行测试 部署libc的库文件 执行测试程序 结语 引言 鸿睿创智的H01开发板是基于RK3568芯片的&#xff0c;瑞芯微芯片的一大特色就是提供了NPU推理的支持。本文将对其NPU推理进行测试。 驱动移植 H01的开发板已经…

概率论得学习和整理29: 用EXCEL 描述二项分布

目录 1 关于二项分布的基本内容 2 二项分布的概率 2.1 核心要素 2.2 成功K次的概率&#xff0c;二项分布公式 2.3 期望和方差 2.4 具体试验 2.5 概率质量函数pmf 和cdf 3 二项分布的pmf图的改进 3.1 改进折线图 3.2 如何生成这种竖线图呢 4 不同的二项分布 4.1 p0.…

数据结构(二叉树)

前言&#xff1a; 在数据结构那片浩瀚无垠、仿若神秘宇宙的天地里&#xff0c;二叉树宛如一颗散发着独特光辉、极为耀眼的星辰。它就像一位技艺精湛的建筑师&#xff0c;运用独特的二叉分支结构&#xff0c;精心构建起层次分明、秩序井然的数据组织 “大厦”。根节点仿若大厦的…