Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menukar kepingan yang dipetakan menjadi kepingan struktur dengan sifat yang berbeza

Bagaimana untuk menukar kepingan yang dipetakan menjadi kepingan struktur dengan sifat yang berbeza

WBOY
WBOYke hadapan
2024-02-08 22:27:29759semak imbas

Bagaimana untuk menukar kepingan yang dipetakan menjadi kepingan struktur dengan sifat yang berbeza

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!

Kandungan soalan

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 的切片,其中包含 bc yang merupakan peta rentetan dengan kekunci yang berbeza.

Saya mahu a 转换为一个结构体切片,其中第一个元素是一个以 prop1prop2 作为属性的结构体,第二个元素是一个以 prop3prop4 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

Penyelesaian

Apa yang boleh anda lakukan ialah gelung pertama melalui setiap peta secara individu, membina kepingan nilai 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())
}
🎜🎜https://www.php.cn/link/3722e31eaa9efae6938cc5c435365dfd🎜🎜

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam