go - 为什么未编组的 YAML 数据为空?
问题描述
我在解组一段简单的 YAML 数据时遇到问题:
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
type myDataStruct struct {
HTTP []struct {
Name string
Target string
}
}
func main() {
yamlData := `
HTTP:
- name: one
target: http://wazaa
- name: two
target: http://wazii
`
var myData myDataStruct
err := yaml.Unmarshal([]byte(yamlData), &myData)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Print(myData)
}
游乐场: https: //play.golang.org/p/Srb2DJVVZqN
结果是{[]}
,我对 Go 的有限知识无助于理解为什么?
解决方案
如果您不指定 YAML 源和 Go 结构字段中使用的标签之间的映射,则默认情况下,只有将第一个字母更改为较低的匹配项,它们才会匹配。
例如,结构字段Name
将匹配name
,但不匹配NAME
。
指定HTTP
字段的映射:
type myDataStruct struct {
HTTP []struct {
Name string
Target string
} `yaml:"HTTP"`
}
通过此更改,它可以工作并输出(在Go Playground上尝试):
{[{one http://wazaa} {two http://wazii}]}
为所有字段提供映射是一种很好的做法,因此如果您重命名字段,它将继续工作:
type myDataStruct struct {
HTTP []struct {
Name string `yaml:"name"`
Target string `yaml:"target"`
} `yaml:"HTTP"`
}
尽管在您的情况下,默认匹配适用于Name
andTarget
字段而不提供映射。