第 3 章:GO 的接口和抽象 拓展篇 - CRUD 接口实现示例

第 3 章:GO 的接口和抽象 拓展篇 - CRUD 接口实现示例

在前面的第3章中,我们用简单的代码展示了GO的接口和抽象方法,但是代码的示例较少,部分同学可能会觉得理解起来比较抽象。因此在本章中,我们将通过一个具体的例子来演示如何使用 GO 语言的接口来实现抽象化的设计。我们将定义一个 CrudInterface 接口,该接口将提供 CRUD(创建、读取、更新、删除)操作的通用方法。然后,我们将为两种不同的存储系统(MySQL 和 Redis)提供该接口的具体实现。此外,我们还将展示如何根据传入参数中的 URI 协议来动态选择使用哪种存储实现。

Implements
Implements
CrudInterface
+Create(ctx context.Context, key string, value interface) : error
+Read(ctx context.Context, key string) (interface, error)
+Update(ctx context.Context, key string, value interface) : error
+Delete(ctx context.Context, key string) : error
MySQLStore
+Create(ctx context.Context, key string, value interface) : error
+Read(ctx context.Context, key string) (interface, error)
+Update(ctx context.Context, key string, value interface) : error
+Delete(ctx context.Context, key string) : error
RedisStore
+Create(ctx context.Context, key string, value interface) : error
+Read(ctx context.Context, key string) (interface, error)
+Update(ctx context.Context, key string, value interface) : error
+Delete(ctx context.Context, key string) : error
3.1 定义 CrudInterface 接口

首先,我们定义 CrudInterface 接口,它包含 CRUD 操作的方法:

package main

import (
	"context"
	"errors"
)

// CrudInterface 定义了CRUD操作的方法
type CrudInterface interface {
	Create(ctx context.Context, key string, value interface{}) error
	Read(ctx context.Context, key string) (interface{}, error)
	Update(ctx context.Context, key string, value interface{}) error
	Delete(ctx context.Context, key string) error
}
3.2 实现 MySQL 存储

我们将创建一个 MySQLStore 结构体,它实现了 CrudInterface 接口:

type MySQLStore struct {
	// 此处包含连接数据库所需的字段
}

func (m *MySQLStore) Create(ctx context.Context, key string, value interface{}) error {
	// 实现创建逻辑
	return nil
}

func (m *MySQLStore) Read(ctx context.Context, key string) (interface{}, error) {
	// 实现读取逻辑
	return nil, nil
}

func (m *MySQLStore) Update(ctx context.Context, key string, value interface{}) error {
	// 实现更新逻辑
	return nil
}

func (m *MySQLStore) Delete(ctx context.Context, key string) error {
	// 实现删除逻辑
	return nil
}
3.3 实现 Redis 存储

同样地,我们将创建一个 RedisStore 结构体,它也实现了 CrudInterface 接口:

type RedisStore struct {
	// 此处包含连接Redis所需的字段
}

func (r *RedisStore) Create(ctx context.Context, key string, value interface{}) error {
	// 实现创建逻辑
	return nil
}

func (r *RedisStore) Read(ctx context.Context, key string) (interface{}, error) {
	// 实现读取逻辑
	return nil, nil
}

func (r *RedisStore) Update(ctx context.Context, key string, value interface{}) error {
	// 实现更新逻辑
	return nil
}

func (r *RedisStore) Delete(ctx context.Context, key string) error {
	// 实现删除逻辑
	return nil
}
3.4 创建存储的工厂函数

我们将编写一个工厂函数 NewCrudStore,它根据 URI 协议来创建和返回相应的 CrudInterface 实现:

func NewCrudStore(uri string) (CrudInterface, error) {
	switch uri {
	case "mysql://default":
		return &MySQLStore{}, nil
	case "redis://default":
		return &RedisStore{}, nil
	default:
		return nil, errors.New("unsupported URI scheme")
	}
}
3.5 主程序中的动态选择

在主程序中,我们将使用传入的 URI 参数来动态选择和创建存储实现:

func main() {
	uri := "mysql://default" // 这可以是命令行参数或其他配置来源
	store, err := NewCrudStore(uri)
	if err != nil {
		log.Fatalf("Failed to create CRUD store: %v", err)
	}

	// 现在可以使用store进行CRUD操作
	// 例如: store.Create(ctx, "key", "value")
}
3.6 用时序图来描述一种可能的行为

基于上面的代码,我们可以得出一种可能的行为,当客户端要创建一条记录时,NewCrudStore能过传入的URL参数,得知这次的创建是要写入redis,于是最终接口调用了RedisStore保存了数据。

客户端 main函数 NewCrudStore工厂函数 RedisStore Redis数据库 调用创建记录 创建CrudInterface实例 传入URI参数 "redis://default" 实例化RedisStore 连接到Redis 连接成功 返回RedisStore实例 调用Create方法 执行SET命令 返回执行结果 返回结果给main函数 返回结果给客户端 客户端 main函数 NewCrudStore工厂函数 RedisStore Redis数据库

在这个时序图中:

  1. 客户端调用main函数来创建一条新记录。
  2. main函数请求NewCrudStore工厂函数创建一个CrudInterface类型的实例。
  3. NewCrudStore工厂函数根据传入的URI参数(在这个场景中是"redis://default")实例化一个RedisStore对象。
  4. RedisStore对象尝试连接到Redis数据库。
  5. 连接成功后,RedisStoreCreate方法被main函数调用,以创建新记录。
  6. RedisStore在Redis数据库中执行SET命令来保存新记录。
  7. Redis数据库返回执行结果给RedisStore
  8. RedisStore将结果返回给main函数。
  9. 最终,main函数将结果返回给客户端。

通过这个例子,我们展示了如何利用 GO 语言的接口特性来实现一个灵活的、可插拔的 CRUD 服务。程序可以根据运行时的配置动态选择使用 MySQL 或 Redis 作为后端存储,而不需要修改业务逻辑代码。这种设计提高了系统的可扩展性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端技术】HTML基础入门篇

1.1 HTML简介 ​ HTML(HyperText Markup Language:超文本标记语言)是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组…

uView u-parse 在nvue页面中无作用踩坑

问题起因: 在uni-app开发的app nvue页面中有需要回显渲染字符串形式的富文本内容 但使用v-html和uniapp的rich-text组件都无法起到作用,就想到了使用uView中u-parse进行尝试。 uView我是使用uniApp插件市场导入的方式将插件导入项目的uni_modules中 …

2024年教你学浪视频抓取#小浪助手

在2024年,学浪平台已经成为学习者们追逐知识、获取学习资源的热门平台之一。然而,尽管学习平台提供了丰富多样的学习内容,但有时候我们还是希望能够将这些学习资源下载下来,以便随时随地进行学习。那么,如何学习学浪视…

【layoutlmv3推理】无法识别的pdf使用ocr识别代码demo实例

目录 前情提要一、安装依赖1、直接安装的依赖2、需要编译的依赖1)Leptonica2)icu3)Tesseract 3、需要自行配置的依赖 二、模型下载三、更改transformers源码四、加载光学字符识别语言包五、运行代码 前情提要 在做pdf转文本时,发…

用于割草机器人,商用服务型机器人的陀螺仪

介绍一款EPSON推出适用于割草机器人,商用服务型机器人的高精度陀螺仪模组GGPM61,具体型号为GGPM61-C01。模组GGPM61是一款基于QMEMS传感器的低成本航向角输出的传感器模组,它可以输出加速度、角速度及姿态角等信息,为控制机器人运…

航空业微服务架构中台的构建与实践

随着航空业的快速发展,航空公司需要面对更加复杂的业务环境和客户需求。在这样的背景下,构建一个稳健、高效的微服务架构中台成为了航空公司的当务之急。本文将探讨航空业微服务架构中台的设计理念、关键技术以及实践经验,帮助航空公司构建具…

「Java开发指南」如何利用MyEclipse启用Spring DSL?(二)

本教程将引导您通过启用Spring DSL和使用Service Spring DSL抽象来引导Spring和Spring代码生成项目,本教程中学习的技能也可以很容易地应用于其他抽象。在本教程中,您将学习如何: 为Spring DSL初始化一个项目创建一个模型包创建一个服务和操…

面向多源异质遥感影像地物分类的自监督预训练方法

源自:测绘学报 作者:薛志祥, 余旭初, 刘景正, 杨国鹏, 刘冰, 余岸竹, 周嘉男, 金上鸿 摘 要 近年来,深度学习改变了遥感图像处理的方法。由于标注高质量样本费时费力,标签样本数量不足的现实问题会严重影响深层神经网络模型的性能。为解决这一突出矛盾…

将本地项目推送至gitlab仓库

1. gitlab上新建一个空白项目 gitlab上点击new project按钮,新建一个项目 新建空白项目 项目名称与本地新建项目名称相同,其余根据具体需要选择 2. 初始化本地仓库并commit项目 进入本地项目根目录下,右击 git bash here打开命令窗口 初始化…

MappedStatement解析流程

前言 之前写了一篇博文,介绍了mybatis的解析过程,其中mapper标签只演示了如何使用,这篇博文我们来探究mapper标签解析流程 源码解析 核心方法入口 引入mapper方式 使用相对于类路径的资源引用使用完全限定资源定位符(URL&…

“五之链”第十六期沙龙活动在呆马科技成功举办

2024年4月19日,由临沂呆码区块链网络科技有限公司(呆马科技)承办的第十六期“五之链”物流主题沙龙活动成功举办。此次活动邀请了政府相关部门、知名科研院所、物流企业等20余家单位参与,共同探讨物流数据要素流通与智能应用的发展…

新版ONENET(2024/4/24)通过view3.0可视化保姆级教程(一学就会)附效果图

⏩ 大家好哇!我是小光,想要成为系统架构师的嵌入式爱好者。 ⏩上一篇是STM32通过ESP8266连接最新版的ONENET,成功将数据上传之后,本篇文章使用ONENET的view3.0可视化对数据进行可视化做一个详细教程。 ⏩感谢你的阅读,…

AnaTraf网络流量分析仪:实时分析工具助您优化网络架构

导言: 在如今高度互联的数字时代,网络流量分析成为了企业和组织必备的工具之一。AnaTraf网络流量分析仪作为一款高性能的实时网络流量分析工具,不仅能够帮助用户进行全流量回溯分析、网络流量监控和网络性能分析,更可以快速排除网…

两天速通阿里

感觉这一周太梦幻了,就像一个梦,很不真实~~~ 感觉这个暑期,我的运气占了99成,实力只有百分之一 4.15上午 腾讯csig 腾讯云部门,面完秒进入复试状态 4.16下午 美团优选供应链部门,4.18上午发二面 4.17晚上 阿…

C#基础|属性Property之读写特性和经典总结

哈喽,你好,我是雷工。 本节学习属性特性——控制读写操作,以下为学习笔记。 01 只读属性 写法1:直接去掉set方法,可以在定义的时候初始化。 示例: public string CourseName{get;}“雷工笔记…

2024年学浪提取视频#小浪助手

2024年,学习视频已经成为人们获取知识和提升技能的重要途径,而学浪视频平台以其丰富多样的学习资源备受瞩目。然而,有时我们可能只需要其中的一小部分内容,而不想将整个视频都下载下来。在这个时候,小浪助手作为一款强…

软件无线电系列——Nyquist采样定理

本节目录 一、Nyquist采样定理 1、Nyquist采样定理的定义 2、Nyquist采样定理的证明本节内容 一、Nyquist采样定理 如果对某一时间连续信号进行采样,当采样速率达到一定数值时,就可以根据这些采样值准确地确定原信号。 1、Nyquist采样定理的定义 何为Ny…

这操作真牛!APT杜绝软件包被篡改

0x00 简介 我们介绍了传统包管理器、新型包管理器的工作方式,其中用了大篇幅介绍 APT 包管理器,但是没有对安全人员比较关心的软件包校验问题进行介绍 0x01 大众疑问环节 这部分主要是从常规 Linux 使用者的视角,提出一些平时工作过程中的…

到底什么是爬虫

1. 引言 在数据驱动的世界里,网络爬虫(Web Crawling)技术扮演着获取和处理网上数据的关键角色。无论是为了数据分析、机器学习项目的数据集构建还是简单地监测网页变化,学习如何创建一个基本的网页爬虫可以大大提升你的工作效率和…

万兆以太网MAC设计(7)ARP协议报文格式详解以及ARP层模块设计

文章目录 前言:1、ARP协议详解2、ARP工作机制 二、ARP_RX模块设计三、ARP_TX模块设计四、ARP_table模块5、仿真5.1、发送端5.2、接收端5.3、缓存表 总结 前言: 1、ARP协议详解 ARP数据格式: 硬件类型:表示硬件地址的类型。它的值为1表示以太…
最新文章