在 Go 中将映射转换为结构体:高效方法
用 Go 中的映射数据填充结构体可能是一项常见任务,并且使用中间 JSON 转换可能会让人感觉效率低下。幸运的是,有更有效的方法来完成这种转换。
强烈推荐的一种方法是利用 Mitchell Hashimoto 的多功能“mapstruct”包。有了这个包,你可以简单地调用:
import "github.com/mitchellh/mapstructure" mapstructure.Decode(myData, &result)
这个优雅的语法将把映射 myData 解码为结构结果,以最小的麻烦。
如果你更喜欢更 DIY 的方法,你可以请遵循以下代码片段中概述的全面解决方案:
func SetField(obj interface{}, name string, value interface{}) error { // Get a handle on the struct value and field structValue := reflect.ValueOf(obj).Elem() structFieldValue := structValue.FieldByName(name) // Check validity and permissions for the operation if !structFieldValue.IsValid() { return fmt.Errorf("No such field: %s in obj", name) } if !structFieldValue.CanSet() { return fmt.Errorf("Cannot set %s field value", name) } // Match field types for assignment structFieldType := structFieldValue.Type() val := reflect.ValueOf(value) if structFieldType != val.Type() { return errors.New("Provided value type didn't match obj field type") } // Update the field value within the struct instance structFieldValue.Set(val) return nil } type MyStruct struct { Name string Age int64 } func (s *MyStruct) FillStruct(m map[string]interface{}) error { // Iterate over map keys and values, setting corresponding struct fields for k, v := range m { err := SetField(s, k, v) if err != nil { return err } } return nil } func main() { myData := make(map[string]interface{}) myData["Name"] = "Tony" myData["Age"] = int64(23) result := &MyStruct{} err := result.FillStruct(myData) if err != nil { fmt.Println(err) } fmt.Println(result) }
此代码将精心处理字段查找、类型检查和值分配实现map到struct的转换。
以上是如何在 Go 中高效地将 Map 转换为结构体?的详细内容。更多信息请关注PHP中文网其他相关文章!