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

具有未知属性名称的结构的嵌套属性?

井洲
2023-03-14
问题内容

我正在使用JSON将一些值从外部源获取到变量中。

我有一个这样的类型,json.Unmarshal将值放入:

    type Frame struct {
        Type  string
        Value map[string]interface{}
    }

    var data Frame

解组后,我可以通过以下方式访问类型: data.Type

但是如果我尝试做类似的事情:

    if data.Type == "image" {
        fmt.Printf("%s\n", data.Value.Imagedata)
    }

编译器抱怨没有这样的值data.Value.Imagedata

所以我的问题是,我如何根据某些条件引用我知道会存在的Go属性?

做到这一点:

    type Image struct {
        Filename string
    }

    type Frame struct {
        Type  string
        Value map[string]interface{}
    }

但这不是很灵活,因为我将收到不同Value的。


问题答案:

json.Unmarshal会尽力将数据放置在最适合您的类型的位置。从技术上讲,您的第一个示例将起作用,但是Value即使您声明它是地图,您仍尝试使用点符号访问该字段:

这应该给您某种形式的输出:

if data.Type == 'image'{
    fmt.Printf("%v\n", data.Value["Imagedata"])
}

…考虑到“ Imagedata”是JSON中的关键。

您可以选择根据需要或期望的结构深度定义类型,或者使用an
interface{}然后对值进行类型声明。如果该Value字段是一个映射,则您将始终访问键,如Value[key],而该映射项的值就是interface{}您可以键入assert的值Value[key].(float64)

至于做更明确的结构,我发现您可以将对象分解为自己的类型,也可以将其嵌套在一个位置:

嵌套(带有匿名结构)

type Frame struct {
    Type  string
    Value struct {
        Imagedata string `json:"image_data"`
    }
}

单独的结构

type Frame struct {
    Type    string
    Value   value 
}

type value struct {
    Imagedata string `json:"image_data"`
}

我仍然在学习Go自己,所以这是我目前的理解程度:-)。



 类似资料:
  • 问题内容: 我有一个用swift编写的CustomViewController类和用Objective C编写的CustomNavigationController类。我试图将CustomNavigationController作为属性添加到我的CustomViewController中。我已经添加到我的桥接头中。 在我的CustomViewController中,我有: 在尝试构建并运行之前没有

  • 问题内容: 我的错误输出: 无效的配置对象。已使用与API模式不匹配的配置对象初始化Webpack。-configuration.module具有未知的属性“ loaders”。这些属性是有效的:对象{exprContextCritical?,exprContextRecursive?,exprContextRegExp?,exprContextRequest?,noParse ?、规则?,def

  • 我已经在stackoverflow和网络上寻找解决方案。我没有见过有效的解决方案,因为可能没有一个帖子完全符合我的用例,它包含文件中的列表和对象结构。 这里有一个例子作为yaml 这是与属性文件相同的示例 我希望能够向我的应用程序提供 teddy.yml 或 teddy.properties 文件以进行配置。 这是我的课程: 我已经尝试了这种设置,使用环境来尝试访问属性,删除前缀,声明一个“Pro

  • 我有这门课: ContractDetail类如下所示:

  • 问题内容: 这是一个不起作用的简单go程序: 错误: prog.go:18:无效的操作:v [属性](*顶点类型的索引) 我想要的是使用名称访问Vertex X属性。如果我这样做,它会起作用,但不会。 有人可以告诉我如何进行这项工作吗? 问题答案: 大多数代码都不需要这种动态查找。与直接访问相比,它效率低下(编译器知道Vertex结构中X字段的偏移量,可以将vX编译为单个机器指令,而动态查找则需要