In the Go language, map is a powerful data structure that can be used to quickly solve some complex problems. But on some occasions, we may need to convert the map into a struct type for easy operation and use. This article will introduce how to convert golang map into struct.
1. Prerequisite knowledge
Before learning to convert golang map to struct, we need to master the following basic knowledge:
struct is a composite data type that can be composed of multiple fields, each field has its own type and value. In the Go language, you can use struct to represent a custom data type, which can be used to represent any complex data structure, such as student information, product information, etc.
Example:
type Student struct {
Name string Age int ClassNum int
}
map is a key Value pair data structure, which is used to store unordered Key-Value (key-value pair) data. In the Go language, map initialization is created using the make() function, or literals can also be used.
Example:
//Use the make() function to create a map
var m1 map[string]int
m1 = make(map[string]int)
//Use literals to create map
m2 := map[string]int{
"A": 1, "B": 2, "C": 3,
}
Reflection is One of golang's advanced features, it allows the program to dynamically check variable types and values at runtime, as well as modify the values and types of variables. In golang, the reflect package provides the functions and types required for reflection operations.
Example:
package main
import (
"fmt" "reflect"
)
func main() {
var x float64 = 3.14 fmt.Println("Type:", reflect.TypeOf(x)) //输出变量类型 fmt.Println("Value:", reflect.ValueOf(x)) //输出变量值
}
2. Method of converting map to struct
In golang, you can use reflection to convert map type to struct type. The specific steps are as follows:
First, we need to define a struct type to store data converted from the map type.
Example:
type Student struct {
Name string Age int ClassNum int
}
Next, we define A map type variable and initialize some key-value pair data in it.
Example:
m := map[string]interface{}{
"Name": "小明", "Age": 18, "ClassNum": 3,
}
We define a variable of struct type, and its type is consistent with the defined struct type.
Example:
var s Student
Finally, we convert the map type into struct through reflection Type, the specific implementation is as follows:
func MapToStruct(m map[string]interface{}, s interface{}) error {
structValue := reflect.ValueOf(s).Elem() for k, v := range m { structFieldValue := structValue.FieldByName(k) if !structFieldValue.IsValid() { continue } if !structFieldValue.CanSet() { return fmt.Errorf("Cannot set %s field value", k) } val := reflect.ValueOf(v) if structFieldValue.Type() != val.Type() { return fmt.Errorf("Provided value %+v type %s didn't match obj field type %s", v, val.Type(), structFieldValue.Type()) } structFieldValue.Set(val) } return nil
}
Here by passing in map The two parameters [string]interface{} and interface{} realize the conversion of map type into struct type. First, get the reflect.Value of s, and then traverse the elements in map[k: v]. If there is this key in the map, take out the corresponding field in reflect.Value through FieldName, then get the reflect.Value of v and After comparing the type, set it into s.
3. Example
You can test this function through the following example code:
func main() {
m := map[string]interface{}{ "Name": "小明", "Age": 18, "ClassNum": 3, } var s Student err := MapToStruct(m, &s) if err != nil { fmt.Println(err) } else { fmt.Printf("%#v
", s)
}
}
Through the above example code, we can convert a map type variable into a struct type variable to facilitate subsequent operations and use.
Summary
The method of converting golang map to struct is to use the characteristics of reflection for conversion. This article introduces the implementation and use of this method in detail through sample code. Although reflection is one of the advanced features of the Go language, in some cases It is quite necessary to use it.
The above is the detailed content of golang map to struct. For more information, please follow other related articles on the PHP Chinese website!