首页 > 其他分享 >用go如何实现接口抽象

用go如何实现接口抽象

时间:2023-12-17 17:56:58浏览次数:29  
标签:SQLite fmt error 接口 抽象 func MySQL go data

当涉及到连接不同类型的数据库时,可以用常见的方式去连接对应的数据库,也可以使用接口抽象的方式使代码更具灵活性和可扩展性,更显优雅。

非接口抽象方式:

如果涉及到多种数据库时,同样的代码显得非常臃肿。

package main

import "fmt"

// 直接定义 MySQL 连接和插入函数
func MySQLConnect() error {
    // MySQL 连接逻辑
    fmt.Println("Connected to MySQL")
    return nil
}

func MySQLInsert(data interface{}) error {
    // MySQL 插入逻辑
    fmt.Println("Inserted data into MySQL:", data)
    return nil
}

// 直接定义 SQLite 连接和插入函数
func SQLiteConnect() error {
    // SQLite 连接逻辑
    fmt.Println("Connected to SQLite")
    return nil
}

func SQLiteInsert(data interface{}) error {
    // SQLite 插入逻辑
    fmt.Println("Inserted data into SQLite:", data)
    return nil
}

func main() {
    // 使用直接定义的函数
    MySQLConnect()
    MySQLInsert("data")

    SQLiteConnect()
    SQLiteInsert("data")
}

使用接口抽象方式:

接口可以定义数据库连接和操作的通用方法,使得不同类型的数据库实现这些方法,从而可以方便地切换和扩展数据库类型。

package main

import "fmt"

// 定义数据库接口
type Database interface {
    Connect() error
    Insert(data interface{}) error
}

// MySQL 数据库实现
type MySQL struct{}

func (m *MySQL) Connect() error {
    // 实现 MySQL 连接逻辑
    fmt.Println("Connected to MySQL")
    return nil
}

func (m *MySQL) Insert(data interface{}) error {
    // 实现 MySQL 插入逻辑
    fmt.Println("Inserted data into MySQL:", data)
    return nil
}

// SQLite 数据库实现
type SQLite struct{}

func (s *SQLite) Connect() error {
    // 实现 SQLite 连接逻辑
    fmt.Println("Connected to SQLite")
    return nil
}

func (s *SQLite) Insert(data interface{}) error {
    // 实现 SQLite 插入逻辑
    fmt.Println("Inserted data into SQLite:", data)
    return nil
}

func main() {
    // 使用接口类型
    var db Database

    // 连接 MySQL 数据库
    db = &MySQL{}
    db.Connect()
    db.Insert("data")

    // 连接 SQLite 数据库
    db = &SQLite{}
    db.Connect()
    db.Insert("data")
}

总结:对比两种方式,使用接口抽象的方式更加灵活和可扩展。当需要切换数据库类型时,只需修改连接的具体实现即可,而不必修改调用数据库的逻辑。这种方式提供了更好的扩展性和可维护性。

标签:SQLite,fmt,error,接口,抽象,func,MySQL,go,data
From: https://www.cnblogs.com/beatle-go/p/17909458.html

相关文章

  • Argo Rollouts Canary结合Istio进行流量迁移实例
    环境说明用argorollouts金丝雀发布策略更新nginx服务。发布过程结合Isito和analysis。创建nsargo-demo#kubectlcreatensargo-demonamespace/argo-democreated启用Istio自动注入功能#kubectllabelnamespaceargo-demoistio-injection=enablednamespace/argo-d......
  • java接口自动化系列(02):测试数据文件设计
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/15867903.html说明本次分享的是测试数据存excel中,后续分享测试数据存yaml中测试用例数据示例解释:标题行每个单词首字母大写,因为代码里面反射会用到解释:字段数据Url:只写路径,不需要写ip、端口RequestType:目......
  • Python实现软件设计模式3:抽象工厂模式
    特点系统中除了有多种产品类型(产品等级结构,如果汁、方便面、矿泉水),还出现了多个品牌(产品族,或农夫山泉、娃哈哈、康师傅、统一等品牌几乎都有这些产品)在工厂方法模式中,只有一个产品等级结构一个抽象产品(父类)、多个具体产品(子类)形成一个产品等级结构产品族是指由同一个工厂生产......
  • SRE Google运维解密 第三章
    第二部分指导思想本部分将描述SRE日常工作背后的指导思想——工作模式、行为方式,以及平时运维工作中关注的重点等。第三章拥抱风险管理风险在构建系统的过程中,可靠性的进一步提升成本并不是线性增加的。高昂的成本主要存在于以下两个维度:冗余物理服务器/计算资源的成......
  • python 使用 Google Gemini API
    python使用GoogleGeminiAPI注册APIKEY:GoogleAIStudio[免费]importbase64importrequestsimportjsonAPI_KEY='yourapikey'img_path='./scones.jpg'#设置模型参数和过滤规则https://ai.google.dev/api/rest/v1beta/SafetySetting?hl=zh-cn#H......
  • 使用Go实现一个百行聊天服务器
    前段时间,redis作者不是整了个c语言版本的聊天服务器嘛,地址,代码量拢共不过百行.于是,心血来潮下,我也整了个Go语言版本.简单来说就是实现了一个聊天室的功能.将所有注释空行都去掉,刚好100行实现.废话不多说,先上代码:packagemainimport( "fmt" "log" "net"......
  • 第八章:SpringBoot-Java工程及关系和修改启动logo(了解)
    一、springbootJava工程(了解)二、关闭&修改启动logo(了解)......
  • 数据结构与算法 第一章(48课时课程笔记)Data Structure and Algorithms
    数据结构基础知识 数据(Data):是对信息的一种符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。数据元素(DataElement):是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项(DataItem)组成。数据......
  • 2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和
    2023-12-16:用go语言,给定整数数组arr,求删除任一元素后,新数组中长度为k的子数组累加和的最大值。来自字节。答案2023-12-16:来自左程云。灵捷3.5大体步骤如下:算法maxSum1分析:1.计算输入数组arr的长度n。2.如果n<=k,则返回0。3.初始化ans为int类型的最小值(math......
  • 2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和
    2023-12-16:用go语言,给定整数数组arr,求删除任一元素后,新数组中长度为k的子数组累加和的最大值。来自字节。答案2023-12-16:来自左程云。灵捷3.5大体步骤如下:算法maxSum1分析:1.计算输入数组arr的长度n。2.如果n<=k,则返回0。3.初始化ans为int类型的最小值(math.MinInt32)......