我正在使用 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/