Golang 中将结构体转换为 Map 的函数
问题:
如何我在 Golang 中有效地将结构转换为映射,利用 JSON 标签作为键,其中可能吗?
答案:
第三方库:
Fatih 的 structs 包为此提供了一个简单而全面的解决方案任务:
func Map(object interface{}) map[string]interface{}
用法:
package main import ( "fmt" "github.com/fatih/structs" ) type Server struct { Name string `json:"name"` ID int32 `json:"id"` Enabled bool `json:"enabled"` } func main() { s := &Server{ Name: "gopher", ID: 123456, Enabled: true, } m := structs.Map(s) fmt.Println(m) // Output: {"name":"gopher", "id":123456, "enabled":true} }
功能:
自定义实现:
如果首选自定义实现,可以使用reflect.Struct :
func ConvertToMap(model interface{}) map[string]interface{} { // Get the reflect type and value of the model modelType := reflect.TypeOf(model) modelValue := reflect.ValueOf(model) if modelValue.Kind() == reflect.Ptr { modelValue = modelValue.Elem() } // Check if the model is a struct if modelType.Kind() != reflect.Struct { return nil } // Create a new map to store the key-value pairs ret := make(map[string]interface{}) // Iterate over the fields of the struct for i := 0; i < modelType.NumField(); i++ { // Get the field and its name field := modelType.Field(i) fieldName := field.Name // Check if the field has a JSON tag jsonTag := field.Tag.Get("json") if jsonTag != "" { fieldName = jsonTag } // Get the value of the field fieldValue := modelValue.Field(i) // Recursively convert nested structs switch fieldValue.Kind() { case reflect.Struct: ret[fieldName] = ConvertToMap(fieldValue.Interface()) default: ret[fieldName] = fieldValue.Interface() } } return ret }
但是,这需要手动提取字段名称并转换嵌套结构体。
以上是如何使用 JSON 标签高效地将 Go 结构体转换为 Map?的详细内容。更多信息请关注PHP中文网其他相关文章!