首页 > 解决方案 > 为什么未编组的 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 的有限知识无助于理解为什么?

标签: gostructyamlunmarshalling

解决方案


如果您不指定 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"`
}

尽管在您的情况下,默认匹配适用于NameandTarget字段而不提供映射。


推荐阅读