【发布时间】:2018-12-14 17:24:21
【问题描述】:
我有多个数据库表,每个表都有一个具体的结构。我正在使用 sqlx。我的数据库访问功能适用于每个具体结构。
由于我的许多数据库操作(例如,插入一行)在表中都是相同的,我想通过使用一组通用函数来处理它们,这些函数采用接口并执行操作。
在一个接受接口并调用 sqlx 函数的函数中(例如 sqlx.Get),我需要将具体结构从接口中拉出来交给 sqlx。我被难住了。
我读过Laws of Reflection。我已经阅读了reflect 包文档。我已经看遍了,似乎无法将这些部分正确地组合在一起。
具体代码:
type Persistable interface {
DbFieldNames() []string
DbPrepCreate() error
TableName() string
}
type Session struct {} 实现了这些方法并被接受为 Persistable。
此语句工作正常(显式创建具体结构。
// src is the Persistable passed into this function
dest := Session{}
err = stmt.Get(&dest, src)
但是在公共函数中使用显式创建的结构会破坏目的。我想做的是这样的:
dest := SomeFunctionThatExtractsTheConcreteStruct( src ) # 这样我就可以将该 dest 传递给 sqlx。
我使用了 reflect 包来检查 src 变量(类型、值、种类……)。我可以很容易地看到 src 包含一个 *Session。我可以得到真正的价值。但是从 src 创建一个具体的类来传递给 sqlx 让我望而却步。
【问题讨论】: