Rumah >pembangunan bahagian belakang >Golang >antara muka golang untuk memetakan
Dalam bahasa Go, jenis antara muka biasanya digunakan untuk menyatakan bahawa objek mungkin mempunyai berbilang pelaksanaan yang berbeza, supaya kod boleh ditulis dengan lebih fleksibel, dan ia juga memudahkan penyelenggaraan dan pengembangan kod. Tetapi dalam beberapa kes, kita perlu menukar antara muka kepada jenis peta. Artikel ini akan memperkenalkan cara melaksanakan kaedah menukar antara muka kepada peta dalam golang.
Mengapa anda perlu menukar antara muka kepada peta
Semasa proses pembangunan, kadangkala anda perlu menukar data jenis antara muka kepada jenis peta. Situasi biasa termasuk yang berikut:
Andaikan kita mempunyai struktur bernama Person Entiti mengandungi tiga atribut: nama, umur, dan jantina. Sekarang kita perlu mendapatkan data nama dan umur daripada objek antara muka jenis Orang Ini boleh dicapai dengan menukar antara muka kepada jenis peta:
type Person struct { Name string Age int Gender string } func main() { p := Person{"Tom", 20, "male"} data := map[string]interface{}{"name": p.Name, "age": p.Age, "gender": p.Gender} fmt.Println(data) }
func interfaceToMapByAssertion(iface interface{}) (map[string]interface{}, bool) { t := reflect.TypeOf(iface) if t.Kind() == reflect.Ptr { t = t.Elem() } if t.Kind() != reflect.Struct { return nil, false } v := reflect.ValueOf(iface) if v.Kind() == reflect.Ptr { v = v.Elem() } fields := make(map[string]interface{}) for i := 0; i < t.NumField(); i++ { field := t.Field(i) fieldValue := v.Field(i).Interface() fields[field.Name] = fieldValue } return fields, true }Fungsi ini menentukan sama ada ia adalah jenis struktur dengan mendapatkan maklumat jenis antara muka, kemudian merentasi medan dalam struktur satu demi satu, memperoleh nilai setiap medan melalui refleksi dan menyimpannya dalam peta. Jika penukaran berjaya, peta yang ditukar dan hasil penukaran dikembalikan sebagai benar, jika tidak sifar dan palsu dikembalikan.
func interfaceToMapByReflection(v interface{}) map[string]interface{} { result := make(map[string]interface{}) val := reflect.ValueOf(v) for i := 0; i < val.NumField(); i++ { fieldName := val.Type().Field(i).Name fieldValue := val.Field(i).Interface() result[fieldName] = fieldValue } return result }Fungsi ini menggunakan Jenis dan Nilai yang diperoleh melalui pantulan untuk melintasi semua medan, dapatkannya nama dan nilai, dan simpannya dalam hasilnya sebagai pasangan nilai kunci jenis peta[rentetan]antara muka{}. Kod untuk menukar antara muka kepada map[string]reflect.Jenis nilai adalah seperti berikut:
func interfaceToMapByReflectionWithReflectValue(v interface{}, res map[string]reflect.Value) { val := reflect.ValueOf(v) for i := 0; i < val.NumField(); i++ { fieldName := val.Type().Field(i).Name fieldValue := val.Field(i) res[fieldName] = fieldValue } }Pelaksanaan fungsi ini adalah serupa dengan fungsi di atas, kecuali ia menyimpan hasilnya sebagai map [rentetan]reflect.Jenis nilai, jenis ini boleh mendapatkan maklumat jenis nilai yang disimpan semasa program berjalan. RingkasanArtikel ini memperkenalkan dua cara untuk menukar jenis antara muka kepada jenis peta dalam golang: menggunakan penegasan dan menggunakan pantulan. Kedua-dua kaedah boleh menukar antara muka menjadi peta, tetapi refleksi boleh digunakan untuk mendapatkan maklumat jenis nilai yang disimpan. Apabila menggunakan kaedah ini, kita perlu memberi perhatian untuk menentukan sama ada jenis antara muka adalah struktur dan mengendalikannya dengan sewajarnya.
Atas ialah kandungan terperinci antara muka golang untuk memetakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!