我希望使用反射调用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)
}
}
汪汪一只猫
TA贡献1898条经验 获得超8个赞
我认为您不需要为此进行反射 - 您可以使用切片和...运算符将多个值传递给可变参数函数。
col := rows.Columns()
vals := make([]interface{}, col)
rows.Scan(vals...)
我可能误解了你想要做什么!
- 3 回答
- 0 关注
- 230 浏览
添加回答
举报
0/150
提交
取消