我正在尝试制作一个以 mysql rows.Scan 函数需要它的方式转换结构的函数,所以我不需要手动传递大量参数。注意:我知道 sqlx 的存在以及在每个指针的单独行中手动编写的替代方法,但我想以这种方式解决它,因为我正在学习并想了解发生了什么。我用这个解决方案得到的错误是:panic: sql: Scan error on column index 0: destination not a pointer对我来说看起来valueField.Addr().Pointer()应该是一个指向值的指针。以下是我的代码的简化。type User struct { Name string Age int}func StrutForScan(u interface{}) []interface{} { val := reflect.ValueOf(u).Elem() v := make([]interface{}, val.NumField()) for i := 0; i < val.NumField(); i++ { valueField := val.Field(i) v[i] = valueField.Addr().Pointer() } return v}func ListUsers { rows, err := db.Query("SELECT * FROM users") PanicIf(err) var user User for rows.Next() { err := rows.Scan(StrutForScan(&user)...) PanicIf(err) fmt.Printf("\nName: %s, Age: %s", user.Name, string(user.Age)) }}
1 回答
慕的地6264312
TA贡献1817条经验 获得超6个赞
你需要使用.Interface()不.Pointer()
func StrutForScan(u interface{}) []interface{} {
val := reflect.ValueOf(u).Elem()
v := make([]interface{}, val.NumField())
for i := 0; i < val.NumField(); i++ {
valueField := val.Field(i)
v[i] = valueField.Addr().Interface()
}
return v
}
这背后的原因是.Pointer()返回一个指向数据的实际“指针”,如果不使用unsafe包,你就不能用它做太多事情。
- 1 回答
- 0 关注
- 202 浏览
添加回答
举报
0/150
提交
取消