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

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

如何從接口獲取結構體成員的指針{}

如何從接口獲取結構體成員的指針{}

Go
慕的地8271018 2021-09-10 21:28:47
我想將 struct 的指針傳遞給期望 interface{} 的函數。然后(通過反射)獲取指向結構成員的指針,然后使用此指針修改它。我已經閱讀了很多問答并嘗試了很多變化,但我仍然可以讓它工作。讓我們考慮下面的例子:type Robot struct {    Id int}f := func(i interface {}) {    v :=  reflect.ValueOf(i).Elem().FieldByName("Id")    ptr := v.Addr().Pointer()    *ptr = 100    //^ it needs to me for functions expecting the pointer: Scan(&pointerToValue)}robot := &Robot{}f(robot)println(robot.Id) //I want to get here 100我認為問題在于對反射包的Addr()和Pointer()方法實際上做了什么了解不深..
查看完整描述

1 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

這是函數 f 的工作版本:


func f(i interface{}) {

  v := reflect.ValueOf(i).Elem().FieldByName("Id")

  ptr := v.Addr().Interface().(*int)

  *ptr = 100

}

整型指針的轉換如下:

  • v是一個reflect.Value代表int字段。

  • v.Addr()是一個relfect.Value表示指向該int字段的指針。

  • v.Addr().Interface()是一個interface{}包含int指針。

  • v.Addr().Interface().(*int) 類型斷言interface{}以一個*int

您可以直接設置字段而無需獲取指針:

func f(i interface{}) {

  v := reflect.ValueOf(i).Elem().FieldByName("Id")

  v.SetInt(100)

}


如果您將值傳遞給期望 interface{} 的東西(如 db/sql Scan方法),那么您可以刪除類型斷言:


func f(i interface{}) {

  v := reflect.ValueOf(i).Elem().FieldByName("Id")

  scan(v.Addr().Interface())

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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