获取指向结构字段值的指针

我正在尝试制作一个以 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))


    }

}


慕的地8271018
浏览 203回答 1
1回答

慕的地6264312

你需要使用.Interface()不.Pointer()func StrutForScan(u interface{}) []interface{} {&nbsp; &nbsp; val := reflect.ValueOf(u).Elem()&nbsp; &nbsp; v := make([]interface{}, val.NumField())&nbsp; &nbsp; for i := 0; i < val.NumField(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; valueField := val.Field(i)&nbsp; &nbsp; &nbsp; &nbsp; v[i] = valueField.Addr().Interface()&nbsp; &nbsp; }&nbsp; &nbsp; return v}这背后的原因是.Pointer()返回一个指向数据的实际“指针”,如果不使用unsafe包,你就不能用它做太多事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go