【问题标题】:How to extract concrete struct from interface如何从接口中提取具体结构
【发布时间】: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 让我望而却步。

【问题讨论】:

    标签: go struct interface sqlx


    【解决方案1】:

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

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

    err = stmt.Get(src, args...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2016-05-01
      相关资源
      最近更新 更多