Mendapatkan semula Nama Medan Struktur dengan Refleksi
Dalam keupayaan refleksi Go, seseorang boleh mengintrospeksi struktur sewenang-wenangnya menggunakan pakej pantulan. Walau bagaimanapun, persoalan biasa timbul: bagaimana untuk mendapatkan nama medan struct?
Pertimbangkan kod berikut:
type A struct { Foo string } func (a *A) PrintFoo() { fmt.Println("Foo value is " + a.Foo) } func main() { a := &A{Foo: "afoo"} val := reflect.Indirect(reflect.ValueOf(a)) fmt.Println(val.Field(0).Type().Name()) // Prints "string" }
Dalam contoh ini, matlamatnya adalah untuk mencetak "Foo" menggunakan refleksi. Walau bagaimanapun, kod pada masa ini mencetak "rentetan". Mengapa ini berlaku?
Jawapannya terletak pada kaedah pakej reflect:
Untuk mendapatkan nama medan, kita mesti mendapatkan mencerminkan.Nilai untuk struct itu sendiri. Kita boleh melakukan ini dengan menyahrujuk penuding kepada struct dan mendapatkan pantulannya. Nilai menggunakan reflect.ValueOf.
Seterusnya, kita perlu mendapatkan semula reflect.Value untuk medan pertama struct. Kita boleh melakukan ini menggunakan val.Field(0).
Akhir sekali, kita boleh mendapatkan reflect.Type medan menggunakan val.Field(0).Type(). Untuk mendapatkan nama medan, kami kemudiannya boleh memanggil val.Field(0).Type().Name().
Oleh itu, kod yang diubah suai di bawah akan mencetak "Foo" dengan betul:
fmt.Println(val.Field(0).Type().Field(0).Name())
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Nama Medan Struct Menggunakan Go Reflection?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!