Ich versuche eine Methode zu implementieren, die den Wert von Feldern in einem Objekt ändert, das eine beliebige Struktur haben kann. Die Traversion 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 haben, die nicht einen Zeiger auf eine Struktur umbrochen, sondern die Struktur selbst, kurz:Golang-Reflektion: Felder der Schnittstelle, die eine Struktur umschließt, können nicht gesetzt werden
// 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 lang: http://play.golang.org/p/OsnCPvOx8F
Ich habe The Laws of Reflection Ich bin 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?
UPDATE:
Ich habe es funktioniert im Grunde mit y := reflect.New(reflect.TypeOf(x))
so die Werte von y
sind jetzt einstellbar. Ein ausführliches Beispiel finden Sie unter: https://gist.github.com/hvoecking/10772475
Ah, ich verstehe es. Mein Weg um dieses Problem wäre (um beliebige Strukturen zu unterstützen), eine neue Instanz mit Hilfe von 'y: = reflect.New (reflect.TypeOf (x))' zu erstellen und alle Felder von 'x' in die zu kopieren entsprechende Felder von 'y'. – Heye
Danke Heye, du hast mich eine weitere Stunde der Suche gerettet. :) – Danyel
Das macht vollkommen Sinn; Aber was ist der Grund dafür, warum Sie ein Feld in einem dynamischen Wert nicht ändern können, zum Beispiel "x. (list) .head = z" - da dies keinen ungeeigneten Zeiger erzeugt. – WPWoodJr