Go 如何将*接口{}的一部分作为参数传递?
我想在包Go 如何将*接口{}的一部分作为参数传递?,go,Go,我想在包sql中使用,但是列的数量以及参数的数量在运行时会发生变化。这是Scan()的签名: 根据文档,*接口{}是Scan()接受的类型之一。因此,我想创建一个[]*接口{}片段,并将其作为参数展开 这就是我认为有效的方法: func query(database *sql.DB) { rows, _ := database.Query("select * from testTable") for rows.Next() { data := make([]*i
sql
中使用,但是列的数量以及参数的数量在运行时会发生变化。这是Scan()
的签名:
根据文档,*接口{}
是Scan()
接受的类型之一。因此,我想创建一个[]*接口{}
片段,并将其作为参数展开
这就是我认为有效的方法:
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())
}
}
}
编译失败,无法将数据(类型[]*接口{})用作行的参数中的类型[]接口{}。扫描
。我以为data…
会扩展到&data[0],&data[1]
,但显然不是。我不明白错误信息*接口{}
与接口{}
兼容,所以为什么我不能将指针片扩展到接口类型
这项工作:
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())
}
}
}
但是我不能使用它,因为在编译时列的数量是未知的。如何编写此代码,以便将数量可变的
*接口{}
传递给行。Scan()
?首先,您不能使用[]*接口{}
指向接口的指针片,而不是[]接口{}
,其中接口是指针<代码>[]*接口{}与[]接口{}
不同。只需创建一个接口片段,其中每个元素都是指向具体类型的指针
下面是一个您将如何执行此操作的片段
var x int
var s string
data := []interface{}{&x, &s}
rows.Scan(data...)
有关使用…
扩展运算符的说明
以下是一些相关的问题,这些问题将进一步解释:
为什么你想要
[]*接口{}
而不是[]接口{}
?我只是觉得[]*接口{}
最接近答案。我将编辑我的问题来添加这个细节。指向接口的指针几乎从来都不是正确的方法。
var x int
var s string
data := []interface{}{&x, &s}
rows.Scan(data...)