Golang-Reflexion: Felder der Schnittstelle, die eine Struktur umschließen, können nicht festgelegt werden

Ich versuche, eine Methode zu implementieren, die den Wert von Feldern in einem Objekt ändert, das eine beliebige Struktur haben kann. Das Durchlaufen der Felder ist kein Problem, wenn ich den Zeiger auf eine Struktur habe. Aber ich kann es nicht schaffen, die Felder zu ändern, wenn ich eine Schnittstelle habe, die keinen Zeiger auf eine Struktur umschließt, sondern die Struktur selbst, kurz gesagt:

// 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())

In langen:http://play.golang.org/p/OsnCPvOx8F

ich habe gelesenDie Gesetze der Reflexion Daher ist mir bewusst, dass ich Felder nur ändern darf, wenn ich einen Zeiger auf eine Struktur habe. Also meine Frage ist jetzt:Wie bekomme ich den Zeiger auf die Daten der Struktur?

AKTUALISIEREN:

Ich habe es funktioniert mit im Grundey := reflect.New(reflect.TypeOf(x)) also die Werte vony sind jetzt einstellbar. Ein ausführliches Beispiel finden Sie hier:https://gist.github.com/hvoecking/10772475

Antworten auf die Frage(1)

Ihre Antwort auf die Frage