Heim  >  Artikel  >  Backend-Entwicklung  >  So konvertieren Sie ein Kartenstück in ein Strukturstück mit unterschiedlichen Eigenschaften

So konvertieren Sie ein Kartenstück in ein Strukturstück mit unterschiedlichen Eigenschaften

WBOY
WBOYnach vorne
2024-02-08 22:27:29759Durchsuche

So konvertieren Sie ein Kartenstück in ein Strukturstück mit unterschiedlichen Eigenschaften

php-Editor Xigua zeigt Ihnen, wie Sie Mapping-Slices in Struktur-Slices mit unterschiedlichen Attributen umwandeln. Beim Programmieren stoßen wir häufig auf Situationen, in denen wir einen Kartenausschnitt in einen Strukturausschnitt mit unterschiedlichen Eigenschaften umwandeln müssen. Diese Transformation hilft uns, Daten besser zu organisieren und zu verwalten. In diesem Artikel stellen wir eine einfache, aber effektive Möglichkeit vor, diese Transformation zu implementieren und Ihren Code effizienter und flexibler zu machen. Lass uns einen Blick darauf werfen!

Frageninhalt

Ich verwende eine API und muss ihr ein Strukturfragment übergeben. Ich habe eine Karte und muss sie in eine Struktur umwandeln.

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]]

In diesem Beispiel habe ich also Karten a 的切片,其中包含 bc, die Karten von Zeichenfolgen mit unterschiedlichen Schlüsseln sind.

Ich möchte a 转换为一个结构体切片,其中第一个元素是一个以 prop1prop2 作为属性的结构体,第二个元素是一个以 prop3prop4 als Struktur von Eigenschaften.

Ist das möglich?

Ich habe mir https://github.com/mitchellh/mapstruct angesehen, aber ich kann es für meinen Anwendungsfall nicht zum Laufen bringen. Ich habe diese Antwort gesehen: https://stackoverflow.com/a/26746461/3390419

Erklärt, wie man die Bibliothek nutzt:

mapstructure.Decode(myData, &result)

Dies scheint jedoch davon auszugehen, dass die Struktur, von der result eine Instanz ist, vordefiniert ist, während die Struktur in meinem Fall dynamisch ist. result 是一个实例的结构是预定义的,而在我的例子中,该结构是动态的。

解决方法

您可以做的是首先单独循环每个映射,使用每个映射的键值对构建相应的 reflect.structfield 值切片。准备好这样的切片后,您可以将其传递给 reflect.structof,它将返回一个表示动态结构类型的 reflect.type 值,然后您可以将其传递给 reflect.new 以创建一个 reflect.value

Problemumgehung

Was Sie tun können, ist, zunächst jede Karte einzeln zu durchlaufen und mithilfe der Schlüssel-Wert-Paare jeder Karte das entsprechende reflect.structfield-Wertsegment zu erstellen. Nachdem Sie ein solches Slice vorbereitet haben, können Sie es an reflect.structof

übergeben gibt einen reflect.type-Wert zurück, der den dynamischen Strukturtyp darstellt, den Sie dann an reflect.new übergeben können, um einen reflect.value-Code zu erstellen > , das eine Instanz der dynamischen Struktur darstellt (eigentlich ein Zeiger auf die Struktur). Zum Beispiel

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🎜🎜

Das obige ist der detaillierte Inhalt vonSo konvertieren Sie ein Kartenstück in ein Strukturstück mit unterschiedlichen Eigenschaften. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen