首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go中创建MySql接口的正确方法

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

Stack Overflow用户
提问于 2020-04-22 15:22:18
回答 2查看 56关注 0票数 0

我正在努力将我的应用程序连接到MySql。代码是按照以下方式构造的,但在我看来有点奇怪。这是正确的模式吗?

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

代码语言:javascript
复制
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
}

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

代码语言:javascript
复制
infrastructureMySql.DatabaseObject.ConnectToDb(connectionString)

我觉得很奇怪。有什么意义,有一个接口在第一?如果没有它,我可以简单地使用*sql.DB作为全局变量。感谢您的反馈。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-23 13:53:33

在创建db:See 3. Wrap types for application-specific context 时,我通常喜欢遵循Ben Johnson的指导。

本文提到,通过与接口交互,我们可以在这里提供一个抽象层,因此您不需要在应用层中泄漏这些细节。您已经提到,您希望执行查询和其他命令,以便就这些命令绘制一个接口,如下所示:

代码语言:javascript
复制
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)
}
票数 1
EN

Stack Overflow用户

发布于 2020-04-22 15:27:30

这绝对是不正确的:

  • MySqlDatabase没有实现IMySqlDatabase,所以如果您实际尝试使用interface
  • You're而不是实际使用接口

,它就无法工作。

并有风格问题:

  • 接口返回具体类型,这违背了
  • 接口本身似乎是一个工厂的目的?或者别的什么?目前还不清楚Go中真正需要be/do
  • Interfaces的接口或具体类型不应该被命名为IThing,这就是C#
  • --您似乎拥有修改全局的类型方法,对于使用它们的人来说,这将是非常出乎意料的
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61368797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档