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

Sen*_*lez 10 struct go

我正在使用json从外部源获取一些结构的值.使用UnMarshal将值放在结构中.

我有一个像这样的结构,UnMarshal将值放入:

type Frame struct{
Type string
Value map[string]interface{}
}
var data Frame
Run Code Online (Sandbox Code Playgroud)

在UnMarshal之后,我可以通过以下方式访问类型: data.Type

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

if data.Type == 'image'{
    fmt.Println(fmt.Sprintf("%s", data.Value.Imagedata))
}
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是,如何根据某些条件在我知道的代码中引用GoLang中的属性?

这样做有效:

type Image struct{
Filename string
}

type Frame struct{
Type string
Value map[string]interface{}
}
Run Code Online (Sandbox Code Playgroud)

但这不是很灵活,因为我会收到不同的Values

jdi*_*jdi 15

UnMarshal将竭尽全力将数据放在最适合您的结构的位置.从技术上讲,您的第一个示例将起作用,但您尝试Value使用点表示法访问该字段,即使您将其声明为地图:

这应该给你一些形式的输出:

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

......考虑到"Imagedata"是json的关键.

您可以选择根据需要深入定义结构,或者期望结构,或者使用接口{},然后对值进行类型断言.使用Value字段作为映射,您总是可以访问键Value[key],然后该映射的值是一个接口{},您可以键入断言 Value[key].(float64)

至于做更明确的结构,我发现你可以将对象分解成自己的结构,或者将它定义为嵌套在一个地方:

嵌套(使用匿名结构)

type Frame struct {
    Type    string
    Value struct {
        Imagedata string `json:"image_data"`
    } 
}
Run Code Online (Sandbox Code Playgroud)

单独的结构

type Frame struct {
    Type    string
    Value   value 
}

type value struct {
    Imagedata string `json:"image_data"`
}
Run Code Online (Sandbox Code Playgroud)

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