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)
reflect
Daten festlegte , war comment.gmane.org/gmane.comp.lang.go.general/35045 , aber selbst dortjson.Unmarshal
erledigte er die eigentliche Drecksarbeit