Es ist schwierig, mit Strukturfeldern mithilfe eines reflect
Pakets zu arbeiten. Insbesondere habe ich nicht herausgefunden, wie der Feldwert eingestellt werden soll.
Typ t struct {fi int; fs string} var rt = t {123, "jblow"} var i64 int64 = 456
Name des Feldes i bekommen - das scheint zu funktionieren
var field = reflect.TypeOf(r).Field(i).Name
Abrufen des Werts von Feld i als a) Schnittstelle {}, b) int - dies scheint zu funktionieren
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
Einstellwert des Feldes i - try one - panic
reflect.ValueOf(r).Field(i).SetInt( i64 )
Panic : Reflect.Value · SetInt verwendet einen Wert, der mit einem nicht exportierten Feld ermittelt wurde
vorausgesetzt, es mochte nicht die Feldnamen "id" und "name", also umbenannt in "Id" und "Name"
a) Ist diese Annahme richtig?
b) falls korrekt, für nicht notwendig gehalten, da in derselben Datei / Paket
Einstellwert von Feld i - versuchen Sie zwei (mit großgeschriebenen Feldnamen) - Panik
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
Panic : Reflect.Value · SetInt verwendet einen nicht adressierbaren Wert
Die folgenden Anweisungen von @peterSO sind gründlich und von hoher Qualität
Vier. das funktioniert:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
er dokumentiert auch, dass die Feldnamen exportierbar sein müssen (beginnen mit Großbuchstaben)
quelle
reflect
Daten festlegte , war comment.gmane.org/gmane.comp.lang.go.general/35045 , aber selbst dortjson.Unmarshal
erledigte er die eigentliche DrecksarbeitAntworten:
Go ist als Open Source Code verfügbar . Ein guter Weg, um etwas über Reflexion zu lernen, ist zu sehen, wie die Go-Entwickler es verwenden. Zum Beispiel die Pakete Go fmt und json . Die Paketdokumentation enthält Links zu den Quellcodedateien unter der Überschrift Paketdateien.
Das Go json-Paket führt JSON von und zu Go-Strukturen ein und aus.
Hier ist ein schrittweises Beispiel, das den Wert eines
struct
Feldes festlegt und dabei Fehler sorgfältig vermeidet.Das Go-
reflect
Paket hat eineCanAddr
Funktion.Das Go-
reflect
Paket hat eineCanSet
Funktion, dietrue
impliziert, dass diesCanAddr
auch der Fall isttrue
.Wir müssen sicherstellen, dass wir
Set
dasstruct
Feld können. Beispielsweise,Wenn wir sicher sein können, dass alle Fehlerprüfungen nicht erforderlich sind, vereinfacht sich das Beispiel zu:
quelle
Das scheint zu funktionieren:
Drucke:
quelle