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!
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
的切片,其中包含 b
和 c
, die Karten von Zeichenfolgen mit unterschiedlichen Schlüsseln sind.
Ich möchte a
转换为一个结构体切片,其中第一个元素是一个以 prop1
和 prop2
作为属性的结构体,第二个元素是一个以 prop3
和 prop4
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
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()) }
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!