mengalami kesulitan bekerja dengan bidang struct menggunakan reflect
paket. khususnya, belum menemukan cara mengatur nilai bidang.
ketik t struct {fi int; fs string} var rt = t {123, "jblow"} var i64 int64 = 456
mendapatkan Nama bidang i - ini sepertinya berhasil
var field = reflect.TypeOf(r).Field(i).Name
mendapatkan nilai bidang i sebagai a) antarmuka {}, b) int - ini sepertinya berhasil
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
nilai pengaturan bidang i - coba satu - panik
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflect.Value · SetInt menggunakan nilai yang diperoleh menggunakan bidang yang tidak diekspor
dengan asumsi tidak suka nama kolom "id" dan "name", maka diganti namanya menjadi "Id" dan "Name"
a) apakah asumsi ini benar?
b) jika benar, dianggap tidak perlu karena dalam file / paket yang sama
nilai pengaturan bidang i - coba dua (dengan nama bidang dikapitalisasi) - panik
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflect.Value · SetInt using unaddressable value
Petunjuk di bawah oleh @peterSO dilakukan secara menyeluruh dan berkualitas tinggi
Empat. ini bekerja:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
Ia mendokumentasikan juga bahwa nama bidang harus dapat diekspor (dimulai dengan huruf kapital)
sumber
reflect
untuk mengatur data adalah comments.gmane.org/gmane.comp.lang.go.general/35045 , tetapi bahkan di sana dia biasajson.Unmarshal
melakukan pekerjaan kotor yang sebenarnyaJawaban:
Go tersedia sebagai kode sumber terbuka . Cara yang baik untuk mempelajari refleksi adalah dengan melihat bagaimana pengembang inti Go menggunakannya. Misalnya, paket Go fmt dan json . Dokumentasi paket memiliki tautan ke file kode sumber di bawah judul File paket.
Go json package marshal dan unmarshals JSON dari dan ke struktur Go.
Berikut adalah contoh langkah demi langkah yang menetapkan nilai
struct
bidang sambil menghindari kesalahan dengan hati-hati.reflect
Paket Go memilikiCanAddr
fungsi.reflect
Paket Go memilikiCanSet
fungsi, yang, jikatrue
, menyiratkannyaCanAddr
jugatrue
.Kita perlu memastikan kita bisa
Set
distruct
lapangan. Sebagai contoh,Jika kita dapat yakin bahwa semua pemeriksaan kesalahan tidak diperlukan, contoh disederhanakan menjadi,
sumber
Ini sepertinya berhasil:
Cetakan:
sumber