ciężko pracować z polami struct przy użyciu reflect
pakietu. w szczególności nie wymyślili, jak ustawić wartość pola.
type t struct {fi int; fs string} var rt = t {123, "jblow"} var i64 int64 = 456
uzyskanie nazwy pola i - wydaje się, że działa
var field = reflect.TypeOf(r).Field(i).Name
uzyskanie wartości pola i jako a) interface {}, b) int - wydaje się działać
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
ustawienie wartości pola i - spróbuj jeden - panika
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : Reflect.Value · SetInt przy użyciu wartości uzyskanej przy użyciu niewyeksportowanego pola
zakładając, że nie lubił nazw pól „id” i „name”, więc zmieniono ich nazwy na „Id” i „Name”
a) czy to założenie jest prawidłowe?
b) jeśli jest poprawny, uważany za niepotrzebny, ponieważ w tym samym pliku / pakiecie
ustawienie wartości pola i - spróbuj dwa (z nazwami pól pisanymi wielkimi literami) - panika
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : Reflect.Value · SetInt przy użyciu nieadresowalnej wartości
Poniższe instrukcje autorstwa @peterSO są dokładne i wysokiej jakości
Cztery. to działa:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
Dokumentuje również, że nazwy pól muszą być eksportowalne (zaczynać się od dużej litery)
reflect
do ustawiania danych, były komentarze.gmane.org/gmane.comp.lang.go.general/35045 , ale nawet tam onjson.Unmarshal
wykonywał rzeczywistą brudną robotę