1 回答
TA贡献2003条经验 获得超2个赞
您可以使用结构或地图映射。我将给出两者的一些例子,从地图的地图开始。该类型将被声明为;
CurrentObservation map[string]map[string]string `json:"current_observation"`
在这种情况下,您有一个以字符串作为键的映射,而值是另一个同时具有键和值的字符串的映射。结果,当你编组你的 json 时,你最终会得到类似的东西;
"current_observation" {
"image": { // first level where the value is a map[string]string
"title":"Weather Underground" // inner map, string to string
}
}
如果说你只想打印标题,你会这样做;
fmt.Println(reportJson.CurrentObservation["image"]["title"])
由于那里的数据看起来相当静态,您也可以使用结构来代替。在这种情况下,你会使用这样的东西;
CurrentObservation CurrentObservation `json:"current_observation"`
type CurrentObservation struct {
Image Image `json:"image"`
}
type Image struct {
Url string `json:"url"`
Title string `json:"title"`
Link string `json:"link"`
}
这两个选项产生相同的输出,尽管它们对于不同的输入可能表现不同。例如,如果current_observation接收到另一个版本的作为输入,例如其中有另一个嵌套项,则调用它...previous_observation然后 map 选项将自动解组此数据以及结构选项将排除它的位置,因为没有映射到Go 中的任何对象/类型。
就我个人而言,如果可能的话,我更喜欢 struct 路线,但它因情况而异。对于您的应用程序,地图可能会更好,因为您不使用输入(它以 xml 形式出现)并且您只想打印它current_observation,如果它有 3 个对象,您实际上不必处理的细节在其中,它们都会按预期输出,如果是 5 则相同。使用结构,您必须显式定义每个字段,如果您只是转换输入,这并不是真正必要的。struct 的优点是更多地用于以后有类型安全的地方,尽管在这种情况下,我会说它们仍然相当等价,因为例如任何时候你想访问图像中的东西,就像CurrentObservation.Image.Title你必须执行一个检查以确保 Image 不为零,例如;
if CurrentObservation.Image != nil {
fmt.Println(CurrentObservation.Image.Title)
}
使用地图,您基本上具有相同的开销,只是您检查键是否存在,而不是检查内部结构之一是否为 nil。
编辑:使用复合文字语法初始化地图的示例;
reportJson.CurrentObservation := map[string]map[string]string {
"display_location": map[string]string {
"full": report.Full,
"state_name": report.StateName,
},
}
- 1 回答
- 0 关注
- 206 浏览
添加回答
举报