Pada dasarnya, satu-satunya cara (yang saya ketahui) untuk melakukan iterasi melalui nilai bidang a struct
adalah seperti ini:
type Example struct {
a_number uint32
a_string string
}
//...
r := &Example{(2 << 31) - 1, "...."}:
for _, d:= range []interface{}{ r.a_number, r.a_string, } {
//do something with the d
}
Saya bertanya-tanya, jika ada cara yang lebih baik dan lebih fleksibel untuk mencapai []interface{}{ r.a_number, r.a_string, }
, jadi saya tidak perlu membuat daftar setiap parameter satu per satu, atau sebagai alternatif, apakah ada cara yang lebih baik untuk mengulang melalui struct?
Saya mencoba melihat-lihat reflect
paketnya, tetapi saya menemui hambatan, karena saya tidak yakin apa yang harus dilakukan setelah saya mengambilnya reflect.ValueOf(*r).Field(0)
.
Terima kasih!
go
go-reflect
omninonsense
sumber
sumber
Jawaban:
Setelah Anda mengambil
reflect.Value
bidang dengan menggunakanField(i)
Anda bisa mendapatkan nilai antarmuka dari itu dengan memanggilInterface()
. Nilai antarmuka tersebut kemudian mewakili nilai bidang.Tidak ada fungsi untuk mengonversi nilai bidang menjadi tipe beton karena, seperti yang Anda ketahui, tidak ada obat generik yang digunakan. Dengan demikian, tidak ada fungsi dengan tanda tangan
GetValue() T
denganT
menjadi jenis lapangan yang (yang mengubah tentu saja, tergantung di lapangan).Hal terdekat yang dapat Anda capai dalam perjalanan adalah
GetValue() interface{}
dan inilah yang sebenarnyareflect.Value.Interface()
ditawarkan.Kode berikut mengilustrasikan cara mendapatkan nilai dari setiap bidang yang diekspor dalam struct menggunakan refleksi ( play ):
sumber
reflect.Value.Type()
, ya. Tetapi perhatikan bahwa tipe bukan warga negara kelas satu, jadi Anda hanya dapat membuat contoh nilai baru dari tipe itu menggunakanreflect
.v.Field(i).Interface()
panik jika Anda mencoba mengakses bidang pribadi yang tidak diekspor. Hati-hati :)v.Field(i).CanInterface()
salah satunya dapat menghindari kepanikan dalam kasus bidang yang tidak diekspor.Jika Anda ingin Iterasi melalui Fields and Values dari sebuah struct maka Anda dapat menggunakan kode Go di bawah ini sebagai referensi.
Jalankan di taman bermain
Catatan: Jika Fields di struct Anda tidak diekspor maka
v.Field(i).Interface()
akan menimbulkan kepanikanpanic: reflect.Value.Interface: cannot return value obtained from unexported field or method.
sumber
Mengambil solusi Chetan Kumar dan jika Anda perlu mendaftar ke a
map[string]int
sumber