我找到了关于how to call the Scan variadic function in Golang using reflection的答案。而且那里没有声望要问。

这里是代码的主要部分:

values := make([]interface{}, count)
valuePtrs := make([]interface{}, count)

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

而且我不明白为什么必须将此语句循环?为什么forfor rows.Next中?
for rows.Next() {
  for i, _ := range columns { valuePtrs[i] = &values[i] }
  ..
}

在golang中的每次迭代中valuePtrs会有所不同吗?还是只是错误?

最佳答案

据我了解:https://golang.org/pkg/database/sql/#Rows.Scan

“扫描将当前行中的列复制到dest所指向的值中。”

当您在特定字段中传递它时,可以使用:

rows.scan(&myfield1, &myfield2)

但是在您的实例中,您正在传递一个数组,而该数组的地址并不是您真正想要发送的,Rayfen在上面的评论中是正确的-
考虑替代方案:
rows.scan(&values)

那将是一个指向单个对象的指针,而不是真正的指针数组,因此您必须执行该循环,以便可以发送指向目标变量的指针数组,而不是指向该数组的指针。

关于database - 如何使用不带循环ptrs的反射调用Golang中的Scan variadic函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46121289/

10-17 01:57