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

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

如何在 Go 中設置動態結構字段?

如何在 Go 中設置動態結構字段?

Go
慕田峪7331174 2021-08-16 15:13:50
我在 Go to a 中解組 JSON,map[string]interface{}并使用接口的混合字符串、浮點和切片值來填充PlaceNode結構的字段值。我需要諸如“默認值”之類的東西,因為并非所有 JSON 對象都具有所有 Struct 字段。來自其他語言背景,Structs 是否可索引我習慣于做這樣的事情來設置n Placenode變量的值(例如,好像它是JavaScript中的 a selforthis關鍵字)。n[key] = value;相反,如果可以設置字段,我的PlaceNode結構中有一個方法可以讀取interface{}、使用reflect和可選地分配一個值。我interfaces{}沒有實現所有值,因此我無法直接將其解壓縮到我的結構中。顯然沒有一個字段通過此s.CanSet()檢查。所以我一定是在處理這個錯誤。如何在 Go 中設置動態結構字段?func (n PlaceNode) New(data map[string]interface{}) PlaceNode {    for key, val := range data {        n.Id = key        for k, v := range val.(map[string]interface{}) {            f := reflect.ValueOf(v)            st := reflect.ValueOf(n)            if (st.Kind() == reflect.Struct) {                s := st.FieldByName(k)                if f.Kind() == reflect.String && true == s.CanSet()  {                        s.SetString(f.String());                } else if f.Kind() == reflect.Float64 && true == s.CanSet() {                        s.SetFloat(f.Float());                } else if f.Kind() == reflect.Slice && true == s.CanSet() {                        s.Set(f.Slice(0, f.Len()));                }            }        }    }    return n}該data參數map[string]interface{}有一個也是 a 的接口,map[string]interface{}如下所示:  {   "XV.12A": {    "Area": 1189.132667,    "CensusBlock": 2032,    "CensusBlockGroup": 2,    "CensusCbsaFips": 40900,    "CensusCountyFips": 61,    "CensusMcdFips": 90160,    "CensusMsaFips": 6922,    "CensusPlaceFips": 3204,    "CensusStateFips": 6,    "CensusTract": 203,    "CensusYear": 2010,    "Radius": 19.455402434548,    "RegionSize": 1189.132667   } }
查看完整描述

1 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

當您撥打以下電話時:

st := reflect.ValueOf(n)

ValueOf傳遞了PlaceNode結構的副本。因此,對 所做的任何更改st都不會在n. 出于這個原因,包將這種情況視為不可尋址的值。如果你想要一個reflect.Value代表n,嘗試使用這樣的東西:

st := reflect.ValueOf(&n).Elem()

現在st是直接使用n而不是副本,并且是可尋址的。您現在應該能夠Set*對它及其字段使用各種方法。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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