登录
首页 >  Golang >  Go问答

在两种不同的构造中使用同一函数

来源:stackoverflow

时间:2024-03-09 17:27:23 191浏览 收藏

从现在开始,努力学习吧!本文《在两种不同的构造中使用同一函数》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

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

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

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

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


解决方案


创建一个接口,例如:

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

哇,我想我爱上了 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
}

今天关于《在两种不同的构造中使用同一函数》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>