reflect
paketi kullanarak yapı alanları ile çalışırken zor zamanlar geçiriyor . özellikle, alan değerinin nasıl ayarlanacağını bulamamışlardır.
t struct {fi int; fs dizesi} var rt = t {123, "jblow"} var i64 int64 = 456
i alanının adını alma - bu işe yarıyor gibi görünüyor
var field = reflect.TypeOf(r).Field(i).Name
i alanının değerini a) arayüz {}, b) int olarak almak - bu işe yarıyor gibi görünüyor
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
i alanının ayar değeri - birini dene - panik
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflekte.Value · Dışa aktarılmamış alan kullanılarak elde edilen değeri kullanarak SetInt
"id" ve "ad" alan adlarını beğenmediğini varsayarak, bu nedenle "Kimlik" ve "Ad" olarak yeniden adlandırıldı
a) bu varsayım doğru mu?
b) doğruysa, aynı dosya / pakette olduğu için gerekli olmadığı düşünülüyor
i alanının değerini ayarlama - ikiyi deneyin (alan adları büyük harfle yazılır) - panik
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflektif.Value · SetInt adreslenemeyen değer kullanarak
@PeterSO tarafından aşağıdaki talimatlar eksiksiz ve kaliteli
Dört. bu çalışıyor:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
alan adlarının dışa aktarılabilir olması gerektiğini de belgeler (büyük harfle başlar)
reflect
Veri ayarlamak için kullanan biri için bulabildiğim en yakın örnek comments.gmane.org/gmane.comp.lang.go.general/35045 idi , ancak orada bilejson.Unmarshal
asıl kirli işi