当前位置: 首页 > 面试题库 >

将地图转换为结构

邓光耀
2023-03-14
问题内容

我试图在Go中创建一个通用方法,该方法将填充struct来自的使用数据map[string]interface{}。例如,方法签名和用法可能类似于:

func FillStruct(data map[string]interface{}, result interface{}) {
    ...
}

type MyStruct struct {
    Name string
    Age  int64
}

myData := make(map[string]interface{})
myData["Name"] = "Tony"
myData["Age"]  = 23

result := &MyStruct{}
FillStruct(myData, result)

// result now has Name set to "Tony" and Age set to 23

我知道可以使用JSON作为中介来完成;还有另一种更有效的方法吗?


问题答案:

最简单的方法是使用https://github.com/mitchellh/mapstructure

import "github.com/mitchellh/mapstructure"

mapstructure.Decode(myData, &result)

如果您想自己做,则可以执行以下操作:

http://play.golang.org/p/tN8mxT_V9h

func SetField(obj interface{}, name string, value interface{}) error {
    structValue := reflect.ValueOf(obj).Elem()
    structFieldValue := structValue.FieldByName(name)

    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)
    }

    structFieldType := structFieldValue.Type()
    val := reflect.ValueOf(value)
    if structFieldType != val.Type() {
        return errors.New("Provided value type didn't match obj field type")
    }

    structFieldValue.Set(val)
    return nil
}

type MyStruct struct {
    Name string
    Age  int64
}

func (s *MyStruct) FillStruct(m map[string]interface{}) error {
    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)
}


 类似资料:
  • 问题内容: 我想将一个结构转换为Golang中的地图。如果我可以在创建的地图中使用JSON标签作为键(否则默认为字段名称),那也将很好。 编码愉快!:) 原始帖子 到目前为止,我具有此功能,我正在使用反射包,但我不太了解如何使用该包,请多多包涵。 我也查看了JSON包的源代码,因为它应该包含我所需的实现(或部分实现),但理解得并不多。 问题答案: 我也需要这样的东西。我正在使用将结构转换为地图的内

  • 虽然我们正在为一个特定的(但已经很大的)位置工作,但如果解决方案也能扩展到其他位置就更好了。因为我们只会缓存与系统有关的瓷砖,那么仅仅平铺enitre星球是最好的选择吗?瓦片的尺寸可以用弧秒/分钟来测量,或者这是个坏主意吗? 我们已经使用了Postgres,这似乎可以用PostGIS来完成(这就是光栅吗?),但是在不知道我到底在找什么的情况下跳入文档/教程证明是很困难的。有什么想法吗?

  • 我有这样一个代码: 你能帮我完成代码库吗?

  • 我正在尝试编写代码来掩盖嵌套的json字段。 从...调用此方法。 我在尝试迭代嵌套的json对象时出错... 无法转换scala类型的值。有些要键入scala.collection.mutable.Map 如何以这种方式递归复杂的嵌套json对象?

  • 我正在努力使用Vavr将的减少为一个 有人能提供如何使用/的示例吗?

  • 我有一张这样的地图<代码>地图 钥匙是数字1,2,3,4。。。学生对象是: 我想做的是把它转换成地图 我可以使用这些代码对地图进行分组,但summingDouble不适用于BigDecimal。此外,我无法将我的studentMap转换为StudentInfo地图:( 我的学生信息对象是: