如何使用反射调用 Scan 可变参数函数

我希望使用反射调用Rows.Scan()函数。然而,它需要可变数量的指针,但没有很多源示例。我需要使用反射,因为我计划用来自 Query 调用的值填充切片。所以基本上使用rows.Columns()来获取行的长度,然后用make()一个切片[]interface{}来填充通常使用传递给Scan()函数的指针填充的数据点。


基本上是这样的代码:


col := rows.Columns()

vals := make([]interface{}, len(cols))

rows.Scan(&vals)

任何人都有调用可变参数函数的示例,该函数使用反射获取指针,我可以查看一下?


编辑:示例代码似乎没有做我所追求的。


package main


import (

    _ "github.com/lib/pq"

    "database/sql"

    "fmt"

)



func main() {


    db, _ := sql.Open(

        "postgres",

        "user=postgres dbname=Go_Testing password=ssap sslmode=disable")


    rows, _ := db.Query("SELECT * FROM _users;")


    cols, _ := rows.Columns()


    for rows.Next() {


        data := make([]interface{}, len(cols))


        rows.Scan(data...)


        fmt.Println(data)

    }


}

结果:


[<nil> <nil> <nil> <nil> <nil>]

[<nil> <nil> <nil> <nil> <nil>]

[<nil> <nil> <nil> <nil> <nil>]

[<nil> <nil> <nil> <nil> <nil>]

[<nil> <nil> <nil> <nil> <nil>]

[<nil> <nil> <nil> <nil> <nil>]


弑天下
浏览 233回答 3
3回答

MMMHUHU

清醒一点:你也可以分配一个接口而不是制作一个切片以下代码效果很好:var sql = "select * from table"rows, err := db.Query(sql)columns, err = rows.Columns()colNum := len(columns)var values = make([]interface{}, colNum)for i, _ := range values {&nbsp; &nbsp; var ii interface{}&nbsp; &nbsp; values[i] = &ii}for rows.Next() {&nbsp; &nbsp; err := rows.Scan(values...)&nbsp; &nbsp; for i, colName := range columns {&nbsp; &nbsp; &nbsp; &nbsp; var raw_value = *(values[i].(*interface{}))&nbsp; &nbsp; &nbsp; &nbsp; var raw_type = reflect.TypeOf(raw_value)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(colName,raw_type,raw_value)&nbsp; &nbsp; }}

汪汪一只猫

我认为您不需要为此进行反射 - 您可以使用切片和...运算符将多个值传递给可变参数函数。col := rows.Columns()vals := make([]interface{}, col)rows.Scan(vals...)我可能误解了你想要做什么!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go