【问题标题】:How to access map[string]interface {}?如何访问 map[string]interface {}?
【发布时间】:2021-06-11 13:41:20
【问题描述】:

如何以编程方式访问下面显示的 go 语言结构中的 msg 值“Design”?

subIssues[28].Fields.Unknowns["customfield_11801"] 之后我没有找到访问数据结构的语言结构。

【问题讨论】:

标签: go


【解决方案1】:

要转换为结构并使用它,请查看此 repo:https://github.com/mitchellh/mapstructure

如果你想自己做,像这样:(调整实现以匹配你的项目)

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

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 2015-01-14
    • 2021-05-26
    • 2016-08-06
    • 2018-08-05
    • 2015-05-02
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多