首页 > 解决方案 > 在两个不同的结构上调用相同的函数

问题描述

我有两个函数接受指向不同结构的不同指针,但这些结构具有相同的底层函数。

func Save(db *sql.DB) error {
  db.Prepare(query)
}

func TxSave(tx *sql.Tx) error {
  tx.Prepare(query)
}

当我将来需要扩展此功能时,我不想对这两个功能进行更改。在这种情况下,我如何在 golang 中坚持 DRYness?

标签: go

解决方案


创建一个接口,例如:

type SQLRunner interface{
    Prepare(query string) (*sql.Stmt, error)
    PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
    Query(query string, args ...interface{}) (*Rows, error)
    QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
    // add as many method shared by both sql.Tx qnd sql.DB
    // ...
} 

然后创建一个采用该接口的方法:

func Save(s SQLRunner) error {
    s.Prepare()
}

在 go 接口实现是隐式的,所以你只需要将 *sql.Tx 或 *sql.DB 传递给 save 函数:

Save(tx)
Save(db)

这里有一篇关于 go 接口的好博文:http: //jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go


推荐阅读