我想實現一個方法,它可以改變可以有任意結構的對象中的字段值。當我有指向結構體的指針時,字段的轉換是沒有問題的。但我不能設法改變字段時,我有一個不指針換到一個結構,但結構本身的接口,簡稱:Golang反射:無法設置包裝結構的接口字段
// The following doesn't work
var x interface{} = A{Str: "Hello"}
// This panics: reflect: call of reflect.Value.Field on ptr Value
reflect.ValueOf(&x).Field(0).SetString("Bye")
// This panics: reflect: call of reflect.Value.Field on interface Value
reflect.ValueOf(&x).Elem().Field(0).SetString("Bye")
// This panics: reflect: reflect.Value.SetString using unaddressable value
reflect.ValueOf(&x).Elem().Elem().Field(0).SetString("Bye")
// This prints `false`. But I want this to be settable
fmt.Println(reflect.ValueOf(&x).Elem().Elem().Field(0).CanSet())
// This works
var z interface{} = &A{Str: "Hello"}
// This prints `true`
fmt.Println(reflect.ValueOf(z).Elem().Field(0).CanSet())
在長:http://play.golang.org/p/OsnCPvOx8F
我已閱讀The Laws of Reflection所以我知道當我有一個指向結構的指針時,我只能修改字段。所以我現在的問題是:如何獲得指向結構數據的指針?
UPDATE:
我得到它的工作基本上使用y := reflect.New(reflect.TypeOf(x))
所以y
值現在設定。有關廣泛的示例,請參閱:https://gist.github.com/hvoecking/10772475
啊,我明白了。我解決這個問題的方法是(爲了支持任意結構)在y:= reflect.New(reflect.TypeOf(x))的幫助下創建一個新實例,並將所有'x'的字段複製到'y'的相應字段。 – Heye
謝謝你,你救了我一個小時的搜索。 :) – Danyel
這很有道理;但是爲什麼你不能在一個動態值中改變一個字段,例如「x。(list).head = z」 - 因爲這不會創建一個懸掛指針。 – WPWoodJr