editor php Xigua akan memperkenalkan anda cara menukar kepingan pemetaan kepada kepingan struktur dengan atribut berbeza. Dalam pengaturcaraan, kita sering menghadapi situasi di mana kita perlu menukar kepingan peta menjadi kepingan struktur dengan sifat yang berbeza. Transformasi ini membantu kami mengatur dan mengurus data dengan lebih baik. Dalam artikel ini, kami akan memperkenalkan cara yang mudah tetapi berkesan untuk melaksanakan transformasi ini, menjadikan kod anda lebih cekap dan fleksibel. Mari lihat!
Saya menggunakan api dan saya perlu menghantarnya serpihan struct. Saya mempunyai peta, jadi saya perlu menukarnya kepada struktur.
package main import "fmt" func main() { a := []map[string]interface{}{} b := make(map[string]interface{}) c := make(map[string]interface{}) b["prop1"] = "foo" b["prop2"] = "bar" a = append(a, b) c["prop3"] = "baz" c["prop4"] = "foobar" a = append(a, c) fmt.println(a) }
[map[prop1:foo prop2:bar] map[prop3:baz prop4:foobar]]
Jadi dalam contoh ini saya mempunyai peta a
的切片,其中包含 b
和 c
yang merupakan peta rentetan dengan kekunci yang berbeza.
Saya mahu a
转换为一个结构体切片,其中第一个元素是一个以 prop1
和 prop2
作为属性的结构体,第二个元素是一个以 prop3
和 prop4
sebagai struktur sifat.
Adakah ini mungkin?
Saya melihat https://github.com/mitchellh/mapstruct tetapi saya tidak dapat menggunakannya untuk kes penggunaan saya. Saya telah melihat jawapan ini: https://stackoverflow.com/a/26746461/3390419
Diterangkan cara menggunakan perpustakaan:
mapstructure.Decode(myData, &result)
Walau bagaimanapun, ini seolah-olah mengandaikan bahawa struct yang result
ialah contoh telah dipratentukan, manakala dalam kes saya, struct adalah dinamik. result
是一个实例的结构是预定义的,而在我的例子中,该结构是动态的。
您可以做的是首先单独循环每个映射,使用每个映射的键值对构建相应的 reflect.structfield
值切片。准备好这样的切片后,您可以将其传递给 reflect.structof
,它将返回一个表示动态结构类型的 reflect.type
值,然后您可以将其传递给 reflect.new
以创建一个 reflect.value
reflect.struct.structfield
yang sepadan menggunakan pasangan nilai kunci setiap peta. Selepas menyediakan kepingan sedemikian, anda boleh menghantarnya ke reflect.structof
, yang akan mengembalikan nilai reflect.type
yang mewakili jenis struktur dinamik, yang kemudian anda boleh hantar ke reflect.new
untuk membuat kod reflect.value
> , yang akan mewakili contoh struktur dinamik (sebenarnya penunjuk kepada struktur).
Sebagai contoh
var result []any for _, m := range a { fields := make([]reflect.StructField, 0, len(m)) for k, v := range m { f := reflect.StructField{ Name: k, Type: reflect.TypeOf(v), // allow for other types, not just strings } fields = append(fields, f) } st := reflect.StructOf(fields) // new struct type sv := reflect.New(st) // new struct value for k, v := range m { sv.Elem(). // dereference struct pointer FieldByName(k). // get the relevant field Set(reflect.ValueOf(v)) // set the value of the field } result = append(result, sv.Interface()) }
Atas ialah kandungan terperinci Bagaimana untuk menukar kepingan yang dipetakan menjadi kepingan struktur dengan sifat yang berbeza. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!