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)
źródło
reflect
do ustawiania danych, były komentarze.gmane.org/gmane.comp.lang.go.general/35045 , ale nawet tam onjson.Unmarshal
wykonywał rzeczywistą brudną robotęOdpowiedzi:
Go jest dostępny jako kod open source . Dobrym sposobem na poznanie refleksji jest zobaczenie, jak używają ich główni programiści Go. Na przykład pakiety Go fmt i json . Dokumentacja pakietu zawiera łącza do plików kodu źródłowego pod nagłówkiem Pliki pakietów.
Pakiet Go JSON organizuje i unmarshals JSON zi do struktur Go.
Oto przykład krok po kroku, który ustawia wartość
struct
pola, uważnie unikając błędów.reflect
Pakiet Go maCanAddr
funkcję.reflect
Pakiet Go maCanSet
funkcję, która, jeślitrue
, sugeruje, żeCanAddr
również jesttrue
.Musimy upewnić się, że możemy pola. Na przykład,
Set
struct
Jeśli możemy być pewni, że wszystkie kontrole błędów są niepotrzebne, przykład upraszcza się,
źródło
To wydaje się działać:
Wydruki:
źródło