我有多个数据库表,每个表都有一个具体的结构。我正在使用 sqlx。我的数据库访问功能适用于每个具体结构。
由于我的许多数据库操作(例如,插入一行)在表中都是相同的,我想通过使用一组通用的函数来处理它们,这些函数采用接口并执行操作。
在一个接受接口并调用 sqlx 函数的函数中(例如,sqlx.Get),我需要将具体结构从接口中拉出来交给 sqlx。我被难住了。
我读过反射定律。我已经阅读了反射包文档。我已经看遍了,似乎无法将这些碎片正确地组合在一起。
具体代码:
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。
我已经使用反射包来检查 src 变量(类型、值、种类……)。我可以很容易地看到 src 包含一个 *Session。我可以得到真正的价值。但是从 src 创建一个具体的类来传递给 sqlx 让我望而却步。