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

WBOY
Lepaskan: 2024-02-08 22:27:29
ke hadapan
758 orang telah melayarinya

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)
}
Salin selepas log masuk
[map[prop1:foo prop2:bar] map[prop3:baz prop4:foobar]]
Salin selepas log masuk

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)
Salin selepas log masuk

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())
}
Salin selepas log masuk
🎜🎜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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!