我有多个数据库表,每个表都有具体的结构。我正在使用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 )
#,这样我就可以将该目标传递给sqlx。
我已经使用了反射包来检查src变量(类型,值,种类,......)。我可以很容易地看到src包含一个* Session。我可以得到真正的价值。但是从src创建一个具体的类以传递到sqlx使我难以理解。
答案 0 :(得分:3)
您有一个名为src
的变量,类型为Persistable
,其中包含一个*Session
。您的目标是获取一个包含interface{}
的{{1}}值,以用作Get方法的第一个参数。
由于*Session
可分配给Persistable
(所有类型),因此您可以简单地将interface{}
传递给Get方法的第一个参数。
src