用go如何实现接口抽象

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

非接口抽象方式:

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

复制代码
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")
}
复制代码

总结:对比两种方式,使用接口抽象的方式更加灵活和可扩展。当需要切换数据库类型时,只需修改连接的具体实现即可,而不必修改调用数据库的逻辑。这种方式提供了更好的扩展性和可维护性。当然,只有两个或者以上的具体类型必须以相同的方法进行处理时才需要做接口抽象。

posted @   李若盛开  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示