我想在sql
包中使用Scan()
函数,但列数和参数数会在运行时发生变化。这是Scan()
的签名:
func (rs *Rows) Scan(dest ...interface{}) error
根据文档,
*interface{}
是 Scan()
接受的类型之一。因此,我想创建一个 []*interface{}
切片,并作为参数进行扩展。以下是我认为应该有效的代码:
func query(database *sql.DB) {
rows, _ := database.Query("select * from testTable")
for rows.Next() {
data := make([]*interface{}, 2)
err := rows.Scan(data...) // Compilation error
fmt.Printf("%v%v\n", *data[0], *data[1])
if err != nil {
fmt.Println(err.Error())
}
}
}
编译失败,错误信息为cannot use data (type []*interface {}) as type []interface {} in argument to rows.Scan
。我以为data...
会扩展为&data[0], &data[1]
,但显然不是这样的。我不理解错误信息。 *interface{}
类型与interface{}
类型兼容,那么为什么不能将指向接口类型的切片进行扩展引用呢?
以下代码可以工作:
func query(database *sql.DB) {
rows, _ := database.Query("select * from testTable")
for rows.Next() {
data := make([]*interface{}, 2)
err := rows.Scan(&data[0], &data[1]) // Only changed this line
fmt.Printf("%v%v\n", *data[0], *data[1]) // Outputs "[48][116 101 120 116]"
if err != nil {
fmt.Println(err.Error())
}
}
}
然而,我无法使用此代码,因为在编译时无法确定列数。如何编写此代码,以便我可以传递变量数量的*interface{}
到rows.Scan()
?
[]*interface{}
而不是[]interface{}
? - Jonathan Hall[]*interface{}
最接近答案。我会编辑我的问题以添加这个细节。 - MakotoE