Scan()
我想在 package 中使用sql
,但列数以及参数的数量将在运行时发生变化。这是以下人的签名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()?
慕的地8271018
红糖糍粑
相关分类