go - 使用底层类型制作接口(interface){}参数的副本

标签 go sqlx

我正在使用 native sql 库和 jmoiron/sqlx 从 postgres 数据库填充结构列表。我目前有针对不同类型的单独功能,例如:

func selectAccounts(ext sqlx.Ext, query string, args []interface{}) ([]Account, error) {
    var accts []Account
    rows, err := ext.Queryx(query, args...)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    for rows.Next() {
        var a Account
        if err = rows.StructScan(&a); err != nil {
            return nil, err
        }
        accts = append(accts, a)
    }
    err = rows.Err()
    return accts, err
}

...但我需要构建一个接受接口(interface){} 并返回 []接口(interface){} 的通用函数。我发现替换上面行 var a Account 的过程很困难,因为它需要复制传入的 interface{} 类型,同时复制其基础类型。我应该接受我需要使用反射这一事实吗,还是有其他方法可以做到这一点?

最佳答案

首先,到目前为止,您在描述中提到的内容似乎有所不同

but I have a requirement to build a generic function that accepts interface{} and returns a []interface{}.

以及您的代码的作用(它接受接口(interface)的一部分而不是接口(interface))。

您可能不需要像您的代码当前那样在函数参数中接受接口(interface)片段,可以只接受一个接口(interface),因此您的函数可以如下所示:

func selectAccounts(ext sqlx.Ext, query string, args interface{}) ([]Account, error) {

您可以返回接口(interface)的一部分,并在其中包含任何类型。请看这个https://play.golang.org/p/NcLxhsiqK8

正如@ivan.sim 提到的,您只需将 Account 附加到接口(interface) slice ,而不是创建 slice Accounts

关于go - 使用底层类型制作接口(interface){}参数的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45665502/

相关文章:

go - 当你有一个分片的 MySQL 数据库解决方案时,你如何使用 go-sql-driver?

json - 通过在golang中检查MongoDB中的多个属性值来检索项目列表

go - go 中输入字节 0 处的非法 base64 数据

json - Mongo-go-driver 从插入结果中获取 objectID

go - go 中有 "pass by reference"(C++) 吗?

sql - 奇怪的 Golang SQL 错误 - WHERE 子句

go - 将 sqlx.Rows.StructScan 用于接口(interface)参数

go - 用通用代码替换 switch 中的逻辑

sql - Go 中数据库迁移的正确策略