go - 在两个不同的结构上调用相同的函数
问题描述
我有两个函数接受指向不同结构的不同指针,但这些结构具有相同的底层函数。
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
推荐阅读
- python - 将 list(element) 附加到另一个列表会按字母给出一个元素
- go - 使用golang使用云触发功能在firebase中进行项目间文件传输
- html - 如何在单击href时翻转展开或折叠文本 - 淘汰赛
- pyopencl - “clGetPlatformIDs 失败:PLATFORM_NOT_FOUND_KHR”在 Windows 上?如何安装驱动程序?
- python-3.x - 长度为 16 的十六进制值的转换不正确
- javascript - Javascript通过对象搜索电话数据并显示在表格中
- php - 从 localhost 调用 Google API
- javascript - 标签之间的 CSS 样式空间
- php - 在 Windows 7 上安装 PEAR
- angular - 如何为动态添加的新输入行设置 ngModel 角度 4+(mat-table)