为什么解组后的 YAML 数据是空的?
Why is the unmarshaled YAML data empty?
我在解组 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
结果是{[]}
,我对围棋的了解有限,无法理解为什么?
如果不指定 YAML source 和 Go struct 字段中使用的标签之间的映射,默认情况下只有将首字母更改为小写匹配时才会匹配它们。
例如结构字段 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
和 Target
字段,但不提供映射。
我在解组 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
结果是{[]}
,我对围棋的了解有限,无法理解为什么?
如果不指定 YAML source 和 Go struct 字段中使用的标签之间的映射,默认情况下只有将首字母更改为小写匹配时才会匹配它们。
例如结构字段 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
和 Target
字段,但不提供映射。