猿问

在 Go 中创建 MySql 接口的正确方法

我正在将我的应用程序连接到 MySql。代码的结构如下,虽然可行,但对我来说有点奇怪。这是正确的模式吗?


我已将与 Db 相关的内容保存在一个单独的文件中,如下所示:


var DatabaseObject MySqlDatabase


type IMySqlDatabase interface {

    ConnectToDb() MySqlDatabase

    GetDb() MySqlDatabase

}


type MySqlDatabase struct{

    Db *sql.DB

}


func (MySqlDatabase) ConnectToDb(connectionString string){

    db, _ := sql.Open("mysql", connectionString)


    _ = db.Ping()


    DatabaseObject = MySqlDatabase{Db: db}

}


    func (MySqlDatabase) GetDb() *sql.DB{

    return DatabaseObject.Db

}

因此,我可以通过以下方式连接到数据库:


infrastructureMySql.DatabaseObject.ConnectToDb(connectionString)

我觉得很奇怪。首先有没有界面的感觉?如果我没有它,我可以简单地使用*sql.DB作为全局变量。感谢您的反馈意见。


回首忆惘然
浏览 96回答 2
2回答

暮色呼如

在创建 db 时,我通常喜欢遵循 Ben Johnson 的本指南: 请参阅 3. Wrap types for application-specific context这篇文章提到我们可以通过与接口交互在这里提供一个抽象层,所以你不需要在应用层泄露这些细节。您提到您想要执行查询和其他命令,以便您可以针对这些命令绘制一个界面,如下所示:type Mysql struct {    db *sql.DB}// Wrap a new connection into the MySql structfunc NewMysql() (*Mysql, error) {    db, err := sql.Open(...)    return &Mysql{ db }, err}func (m *Mysql) GetUsers(...) ([]User, error) {}func (m *Mysql) CreateUsers(...) (User, error) {}type UserStore interface {   GetUsers func(...) []User, error)   CreateUsers func(...) (User, error)}

浮云间

这绝对是不正确的:MySqlDatabase没有实现IMySqlDatabase,所以如果你真的尝试使用该接口,它将无法工作你实际上并没有使用界面并且有风格问题:接口返回具体类型,这违背了目的界面似乎是自己的工厂?或者其他的东西?目前还不清楚接口或具体类型应该是/做什么Go 中的接口不应该被命名IThing,那是 C#您似乎有修改全局变量的类型方法,这对于任何使用它们的人来说都是非常出乎意料的
随时随地看视频慕课网APP

相关分类

Go
我要回答