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.mzph.cn/pingmian/63834.shtml

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

相关文章

llm chat场景下的数据同步

背景 正常的chat/im通常是有单点登录或者利用类似广播的机制做多设备间内容同步的。而且由于长连接的存在,数据同步(想起来)相对简单。而llm的chat在缺失这两个机制的情况下,没见到特别好的做到了数据同步的产品。 llm chat主要两…

【大模型系列篇】GPU资源容器化访问使用指南

在当今的高性能计算和机器学习领域,GPU(图形处理单元)因其卓越的并行计算能力而扮演着至关重要的角色。随着容器化技术如 Docker 的普及,越来越多的数据科学家和开发者选择将他们的应用和工作负载封装到 Docker 容器中&#xff0c…

【毕业设计选题】数据科学与大数据专业毕业设计选题与建议

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…

大数据笔记之flink-cdc实时同步数据

大数据笔记之flink-cdc实时同步数据(mysql -->doris) 一、基本概念 Flink CDC 是一个基于流的数据集成工具,旨在为用户提供一套功能更加全面的编程接口(API)。 该工具使得用户能够以 YAML配置文件的形式,优雅地定义其 ETL&…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕!对于许多编程爱好者来说,这不仅是一次展示自我能力的舞台,更是一次学习和成长的机会。作为一名大一新生的小蓝,对蓝桥杯充满了期待,但面对初次参赛的…

【有啥问啥】大语言模型Prompt中的“System指令”:深入剖析与误区澄清

大语言模型Prompt中的“System指令”:深入剖析与误区澄清 引言 在与大语言模型(LLM)交互时,“prompt”(提示符)这一概念已不再陌生。Prompt是引导模型生成特定类型文本的关键输入,决定了模型的…

linux/centOS7用户和权限管理笔记

linux系列中可以: 配置多个用户配置多个用户组用户可以加入多个用户中 linux中关于权限的管理级别有2个级别,分别是: 针对用户的权限控制针对用户组的权限控制 一,root用户 root用户拥有最大的系统操作权限,而普通…

sheng的学习笔记-AI-注意力模型(Attention Model)

Ai目录:sheng的学习笔记-AI目录-CSDN博客 先看下这两个文章: 序列模型:sheng的学习笔记-AI-序列模型(Sequence Models),RNN,GRU,LSTM_音乐识别是一对多吗-CSDN博客 机器翻译 sheng的学习笔记-AI-自然语…

el-table组件树形数据修改展开箭头

<style lang"scss" scoped> ::v-deep .el-table__expand-icon .el-icon-arrow-right:before {content: ">"; // 箭头样式font-size: 16px; }::v-deep .el-table__expand-icon{ // 没有展开的状态background-color: rgba(241, 242, 245, 1);color:…

已解决:elasticsearch创建索引失败

报错信息 具体报错&#xff1a; org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [typeillegal_argument_exception, reasonunknown setting [index.mappings.properties.category.analyzer] please check that any required plugins are installed…

JAVA学习笔记——第十一章 枚举和注解

一、引出枚举类 1.先看一个需求demo package com.hspedu.enum_;public class Enumration01 {public static void main(String[] args) {Season Spring new Season("春天", "温暖");Season Summer new Season("夏天", "炎热");Seas…

GeeCache-单体并发缓存

实现LRU中value接口的缓存类 使用互斥锁封装LRU缓存类&#xff0c;实现并发访问 实现Group组&#xff0c;用名称对缓存分类 Getter为缓存击穿时调用的回调函数 若缓存击穿则调用回调函数&#xff0c;并把读取到的值加载到缓存中

吸烟抽烟行为识别数据集-超高识别率,支持YOLO,COCO,VOC格式的标注,10162张各种姿势场景下的吸烟图片

吸烟抽烟行为识别数据集-超高识别率&#xff0c;支持YOLO&#xff0c;COCO,VOC格式的标注&#xff0c;10162张各种姿势场景下的吸烟图片 数据集分割 训练组91&#xff05; 9279图片 有效集5&#xff05; 507图片 测试集4% 376图片 预处理 自动定…

云原生基础设施指南:精通 Kubernetes 核心与高级用法

1. 云原生的诞生 随着互联网规模的不断增长&#xff0c;以及企业对敏捷开发、快速交付和高可用性的需求日益增强&#xff0c;传统的单体架构逐渐暴露出局限性&#xff0c;难以满足现代业务对动态扩展和高效迭代的要求。为此&#xff0c;云原生应运而生。 云原生是为云计算时代…

使用Windbg排查C++软件安装包安装时被安全软件拦截导致安装堵塞(线程卡住)的问题

目录 1、问题描述 2、初步分析 3、将Windbg附加到安装包进程上进行分析 4、在Windbg中查看相关变量的值&#xff0c;并设置断点进行动态调试 4.1、在Windbg中查看相关变量的值 4.2、在Windbg中使用bp命令设置断点进行动态调试 5、腾讯电脑管家已经退出&#xff0c;但其…

【OJ题解】面试题三步问题

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 **题目链接****解题思路****1. 问题分析****2. 递归思路****3. 优化方案&a…

MacOS 上以源码形式安装 MySQL 5.7

以下是在 macOS 上从源码安装 MySQL 5.7 的步骤&#xff1a; 前置条件 安装 Homebrew&#xff1a;如果你还没有安装 Homebrew&#xff0c;可以在终端中运行以下命令进行安装&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install…

源码编译安装MySQL

MySQL相应版本的tar包下载 在5.7的版本的MySQL编译安装的时候&#xff0c;需要依赖C语言的库文件【boost】&#xff0c; 如上图所示&#xff0c;如果你使用第一个MySQL的tar包&#xff0c;还需要去网上去下载boost即C语言的库文件&#xff0c;但是第二个tar包就既包含MySQL的源…

Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000

Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000 01 前言 大数据系列&#xff0c;学到了Hive&#xff0c;搭建环境的时候&#xff0c;因为使用的是本机WSL2&#xff08;别问为啥不用VMware&#xff0c;问就是条件有限&#xff0c;而且WS…

定时/延时任务-Netty时间轮源码分析

文章目录 1. 概要2. 参数3. 构造器4. 回收5. 启动时间轮 - start6. 停止时间轮 - stop7. 添加任务8. 工作线程 - Worker8.1 线程参数8.2 核心逻辑-run8.3 指针跳动到下一个tick8.4 处理要取消的任务8.5 把新增的任务加入时间轮8.6 执行过期任务 9. HashedWheelTimeout9.1 属性9…