1 回答

TA贡献1824条经验 获得超8个赞
第一个问题在这里:
for i := range ints {
vals[i] = &ints[i] // Copy references into the slice
}
这是您将要作为 RawBytes 的值设置为接口的指针。
在我解释这意味着什么之前,我会看看我是否可以解释这里的一般想法。
因此,通常在 Go 中从 SQL 获取响应时,每个列和类型(id int,name string,...)都有一个切片,然后您可以将每个 SQL 记录读入该切片,并且每个列都将映射到相同类型的值。
对于像您这样的情况,您将有更多来自 SQL 的响应并且需要 Go 来处理它,您可以这样做:
for i := range ints {
ints[i] = &vals[i] // Copy references into the slice
}
这意味着您的每个interface值都包含一个指向vals数组的指针,该数组将保存来自 SQL 的响应。(在我的示例中,我使用 [][]byte 而不是 RawBytes,因此值 in vals将是来自 SQL 的字节值的一部分。)
然后你会这样做:
err := rows.Scan(ints...)
由于interface可以评估为任何类型,当ints数组被填充时,它将接受任何值,然后根据指针更新 vals 数组中的位置,并将 SQL 中的值作为 RawBytes 类型。
HTH
- 1 回答
- 0 关注
- 150 浏览
添加回答
举报