2

我有多个数据库表,每个表都有一个具体的结构。我正在使用 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 让我望而却步。

4

1 回答 1

3

src您有一个名为type的变量,Persistable其中包含一个*Session. 您的目标是获取一个interface{}包含 a 的值*Session,用作 Get 方法的第一个参数。

因为Persistable可分配给interface{}(所有类型也是如此),所以您可以简单地传递src给 Get 方法的第一个参数。

err = stmt.Get(src, args...)
于 2018-12-14T18:38:48.387 回答