使用golang yaml.v3嵌套节点?

lmvvr0a8  于 2023-06-19  发布在  Go
关注(0)|答案(1)|浏览(109)
## example.yaml

locationSection:
  firstLoc: Canada
  secondLoc: Korea
  thirdLoc: Italy

numberSection:
  person1: 12345
  person2: 98765
  person3: 56789
### this is not an exact go code but just an example...

locationSectionStructure

...
data, err := os.ReadFile(yamlFileFullPath)
if err != nil {
   fmt.Printf("[I/O Error] Falied to read this file from os.ReadFile: %s", cfgFileFullPath)
   panic(err)
}

if err := yaml.Unmarshal(data, exampleNode); err != nil {
   fmt.Printf("[Unmarshal Error] Failed to unmarshal into a yaml Node")
   panic(err)
}
...
if err := exampleNode.Decode(locationSectionNode); err != nil {
...

我使用的是golang yaml.v3包中的Node类型。我的目标是创建一个exampleNode,它表示来自一个示例.yaml文件的数据。此外,我打算基于exampleNode的结构生成额外的节点,即locationSectionNodenumberSectionNode
有没有一个简单的方法来实现这一点?或者我是否错误地使用了Node结构来实现此目的?
谢谢你。

gzjq41n4

gzjq41n41#

我不敢肯定是否完全理解你的要求。顺便说一句,如果我做得很好,下面的代码也应该对你有用。

yaml文件

我按照你的要求使用了一个名为example.yaml的文件。内容如下:

locationSection:
  firstLoc: Canada
  secondLoc: Korea
  thirdLoc: Italy
numberSection:
  person1: 12345
  person2: 98765
  person3: 56789

我本来可以用另一种方式写的,但也许我没有很好地理解你的想法。无论如何,让我们切换到实际读取和解析它的代码。

main.go文件

main.go文件的内容如下:

package main

import (
    "fmt"
    "os"

    "gopkg.in/yaml.v3"
)

type LocationSection struct {
    FirstLoc  string `yaml:"firstLoc"`
    SecondLoc string `yaml:"secondLoc"`
    ThirdLoc  string `yaml:"thirdLoc"`
}

type NumberSection struct {
    Person1 int `yaml:"person1"`
    Person2 int `yaml:"person2"`
    Person3 int `yaml:"person3"`
}

type exampleNode struct {
    LocationSection `yaml:"locationSection"`
    NumberSection   `yaml:"numberSection"`
}

func main() {
    data, err := os.ReadFile("example.yaml")
    if err != nil {
        panic(err)
    }
    var exampleNode exampleNode
    if err := yaml.Unmarshal(data, &exampleNode); err != nil {
        panic(err)
    }
    fmt.Println("locations:", exampleNode.LocationSection)
    fmt.Println("numbers:", exampleNode.NumberSection)
}

这里重要的部分是我如何定义要使用的结构。我定义了一个名为exampleNode的通用结构体来 Package 两个内部对象。然后,我定义了两个结构体LocationSectionNumberSection
请注意在unmarshal阶段使用的YAML标记注解的用法。如果没有它们,您就不能解编组和填充exampleNode结构。
代码的另一部分应该非常简单。
请让我知道,如果这个代码解决了你的问题,或者你需要其他帮助,谢谢!

相关问题