php editor Xigua introduces you how to convert mapping slices into structural slices with different attributes. In programming, we often encounter situations where we need to convert a map slice into a structure slice with different properties. This transformation helps us better organize and manage data. In this article, we'll introduce a simple yet effective way to implement this transformation, making your code more efficient and flexible. Let’s take a look!
I am using an api and I need to pass it a struct fragment. I have a map, so I need to convert it to a structure.
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]]
So in this example I have a slice of map a
which contains b
and c
which are maps of strings with different keys.
I wish to convert a
into a struct slice, where the first element is a struct with prop1
and prop2
as properties, and the second Each element is a structure with prop3
and prop4
as attributes.
is it possible?
I looked at https://github.com/mitchellh/mapstruct but I can't get it to work for my use case. I've seen this answer: https://stackoverflow.com/a/26746461/3390419
Explains how to use the library:
mapstructure.Decode(myData, &result)
However, this seems to assume that the structure where result
is an instance is predefined, whereas in my case the structure is dynamic.
What you can do is first loop through each map individually, using each map's key-value pairs to build the corresponding reflect.structfield
value slice. Once you have such a slice ready, you can pass it to reflect.structof
which will return a reflect.type
value representing the dynamic struct type, and then You can pass this to reflect.new
to create a reflect.value
which will represent an instance of the dynamic structure (actually a pointer to the structure).
For example
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()) }
//m.sbmmt.com/link/3722e31eaa9efae6938cc5c435365dfd
The above is the detailed content of How to convert map slice to structure slice with different properties. For more information, please follow other related articles on the PHP Chinese website!