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

时间:2012-03-21 08:54:49

标签: struct go

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

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

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

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

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

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

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

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

这样做有效:

type Image struct{
Filename string
}

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

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

1 个答案:

答案 0 :(得分:15)

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

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

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

......考虑到“Imagedata”是json的关键。

您可以选择根据需要深入定义结构,或者期望结构,或者使用接口{},然后对值进行类型断言。如果Value字段是地图,您将始终访问Value[key]之类的键,然后该地图的值是一个接口{},您可以键入断言,如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"`
}

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