为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
弑天下 2021-06-11 14:09:46
我希望使用反射调用Rows.Scan()函数。然而,它需要可变数量的指针,但没有很多源示例。我需要使用反射,因为我计划用来自 Query 调用的值填充切片。所以基本上使用rows.Columns()来获取行的长度,然后用make()一个切片[]interface{}来填充通常使用传递给Scan()函数的指针填充的数据点。基本上是这样的代码:col := rows.Columns()vals := make([]interface{}, len(cols))rows.Scan(&vals)任何人都有调用可变参数函数的示例,该函数使用反射获取指针,我可以查看一下?编辑:示例代码似乎没有做我所追求的。package mainimport (    _ "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>]
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

清醒一点:你也可以分配一个接口而不是制作一个切片


以下代码效果很好:


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 {

    var ii interface{}

    values[i] = &ii

}


for rows.Next() {

    err := rows.Scan(values...)

    for i, colName := range columns {

        var raw_value = *(values[i].(*interface{}))

        var raw_type = reflect.TypeOf(raw_value)


        fmt.Println(colName,raw_type,raw_value)

    }

}


查看完整回答
反对 回复 2021-06-21
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

我认为您不需要为此进行反射 - 您可以使用切片和...运算符将多个值传递给可变参数函数。


col := rows.Columns()

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

rows.Scan(vals...)

我可能误解了你想要做什么!


查看完整回答
反对 回复 2021-06-21
  • 3 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信