gpt4 book ai didi

database - 如何使用反射调用扫描可变参数函数

转载 作者:IT老高 更新时间:2023-10-28 13:00:33 24 4
gpt4 key购买 nike

我想调用 Rows.Scan()使用反射的函数。但是它需要可变数量的指针,但没有很多源示例。我需要使用反射,因为我计划用 Query 调用中的值填充 slice 。所以基本上使用 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>]

最佳答案

这是我得出的解决方案。它在遍历数据之前没有得到类型,因此在通过 Scan() 提取值之前事先不知道每个值的类型,但关键是没有事先了解类型。

诀窍是创建 2 个 slice ,一个用于值 slice ,另一个用于保存与值 slice 并行的指针。然后,一旦使用指针填充数据,values 数组实际上会填充数据,然后可以使用这些数据填充其他数据结构。

package main

import (
"fmt"
_ "github.com/lib/pq"
"database/sql"
)

func main() {
db, _ := sql.Open(
"postgres",
"user=postgres dbname=go_testing password=pass sslmode=disable")

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

columns, _ := rows.Columns()
count := len(columns)
values := make([]interface{}, count)
valuePtrs := make([]interface{}, count)

for rows.Next() {
for i := range columns {
valuePtrs[i] = &values[i]
}

rows.Scan(valuePtrs...)

for i, col := range columns {
val := values[i]

b, ok := val.([]byte)
var v interface{}
if (ok) {
v = string(b)
} else {
v = val
}

fmt.Println(col, v)
}
}
}

关于database - 如何使用反射调用扫描可变参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17845619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com