在两个不同的结构上调用相同的函数

时间:2019-03-26 05:04:57

标签: go

我有两个函数可以接受指向不同结构的不同指针,但是这些结构具有相同的基础函数。

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

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

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

2 个答案:

答案 0 :(得分:2)

创建一个界面,例如:

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(tx)
Save(db)

这里有一篇不错的博客文章,介绍了go中的接口:http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go

答案 1 :(得分:0)

哇,我想我爱上了Go。实际上,我可以通过创建自己的界面来做到这一点。

type Saver interface {
  Prepare(query string) (*sql.Stmt, error)
}

func Save(db *sql.DB) error {
  return GenericSave(db)
}

func TxSave(tx *sql.Tx) error {
  return GenericSave(tx)
}

func GenericSave(saver Saver) error {
  stmt := saver.Prepare(query)
  // Do rest with saver
}