为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
回首忆惘然 2022-06-01 11:21:15
我正在将我的应用程序连接到 MySql。代码的结构如下,虽然可行,但对我来说有点奇怪。这是正确的模式吗?我已将与 Db 相关的内容保存在一个单独的文件中,如下所示:var DatabaseObject MySqlDatabasetype 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作为全局变量。感谢您的反馈意见。
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

在创建 db 时,我通常喜欢遵循 Ben Johnson 的本指南: 请参阅 3. Wrap types for application-specific context


这篇文章提到我们可以通过与接口交互在这里提供一个抽象层,所以你不需要在应用层泄露这些细节。您提到您想要执行查询和其他命令,以便您可以针对这些命令绘制一个界面,如下所示:


type Mysql struct {

    db *sql.DB

}


// Wrap a new connection into the MySql struct

func 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)

}


查看完整回答
反对 回复 2022-06-01
?
浮云间

TA贡献1829条经验 获得超4个赞

这绝对是不正确的:

  • MySqlDatabase没有实现IMySqlDatabase,所以如果你真的尝试使用该接口,它将无法工作

  • 你实际上并没有使用界面

并且有风格问题:

  • 接口返回具体类型,这违背了目的

  • 界面似乎是自己的工厂?或者其他的东西?目前还不清楚接口或具体类型应该是/做什么

  • Go 中的接口不应该被命名IThing,那是 C#

  • 您似乎有修改全局变量的类型方法,这对于任何使用它们的人来说都是非常出乎意料的


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信