为什么解组后的 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"`
}

虽然在您的情况下,默认匹配适用于 NameTarget 字段,但不提供映射。