亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取指向結構字段值的指針

獲取指向結構字段值的指針

Go
慕的地8271018 2021-09-21 22:47:06
我正在嘗試制作一個以 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包,你就不能用它做太多事情。


查看完整回答
反對 回復 2021-09-21
  • 1 回答
  • 0 關注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號