如何访问 map[string]interface {}?

问题描述

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

enter image description here

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

解决方法

要转换为结构体并使用它,请查看此存储库: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)
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...