我目前對 golangs 反射包的行為感到絕望,這對我來說似乎根本不一致。1)據我所知,reflect.Value 似乎帶有一個指向底層值的指針。例如,如果我打電話var s stringv1 := reflect.ValueOf(&s).Elem()v2 := v1v2.SetString("Hello World!")fmt.Println(s)它打印我“Hello World!”。然而,這似乎不適用于通過調用 Field() 獲得的reflect.Value。val := ... //Assign a reflect.Value to itnextval := val.Field(0) //Make sure that Field exists and is of type mapnextval = reflect.MakeMap(reflect.MapOf(KEY, ELEM))nextval.SetMapIndex(Some_value_of_type_KEY, Something_of_type_ELEM)fmt.Println(nextval.MapKeys()fmt.Println(val.Field(index).MapKeys())這打印[Some_value_of_type_KEY][]這是一個主要的煩惱。有誰知道為什么會這樣?================================================== =2)考慮功能func Test(v interface{}) { val := reflect.ValueOf(v) if val.Kind() != reflect.Struct { fmt.Println("It is a struct") }}如果我用任何結構作為參數調用它,它會打印“這是一個結構”。但是,由于值不可尋址,我將無法使用 val 為 v 中的內容分配新值。通過以下方式解決:func Test(v interface{}) { val := reflect.ValueOf(&v).Elem() if val.Kind() != reflect.Struct { fmt.Println("This never get's printed!") }}根據文檔,我會假設,通過使用 '&' 我使用指向 v 的指針,并通過調用 Elem() 我得到它指向的元素,因此 val.Kind() 應該仍然返回相同的東西. 它沒有。val.Kind() 現在是一個reflect.Interface。有沒有不用去的方法valForTestingKind := reflect.ValueOf(v)valForSettingNewValue := reflect.ValueOf(&v).Elem()因為這在某種程度上感覺不對。
3 回答

婷婷同學_
TA貢獻1844條經驗 獲得超8個贊
我想談談你的第二個代碼塊:
val := ... //Assign a reflect.Value to it
nextval := val.Field(0) //Make sure that Field exists and is of type map
nextval = reflect.MakeMap(reflect.MapOf(KEY, ELEM))
nextval.SetMapIndex(Some_value_of_type_KEY, Something_of_type_ELEM)
fmt.Println(nextval.MapKeys()
fmt.Println(val.Field(index).MapKeys())
在第三行,您將一個新的、不同的對象重新分配給變量nextval。你不應該在 nextval 上調用某種設置方法而不是重新分配它嗎?在您的第一個示例中,您調用了SetString但在本示例中您只是重新分配了變量,這可能就是行為不同的原因。重新分配變量后,nextval將不再以任何方式連接到val.Field(0). 另外,什么是index?
如果這不能解釋您的問題,請編輯問題以包含一個簡短的、獨立的、正確的、可編譯的示例 ( SSCCE )。我希望能夠將其發布到golang.org首頁的文本框中以便查看問題。如果可能,您應該始終發布 SSCCE。
- 3 回答
- 0 關注
- 217 瀏覽
添加回答
舉報
0/150
提交
取消