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...)