go - Golang 从 yaml 文件中提取值
问题描述
jobs:
- name: test
public: true
plan:
- try:
task: task1
file: test1.yaml
on_success:
in_parallel:
steps:
- task: task2
file: test2.yaml
- task: task3
file: task3.yaml
我想task
从这个 yaml 中提取值。这很棘手,因为它可以位于文件中的不同路径。除了上述之外,还有一些不同的路径task
可以在 yaml 文件中找到。有没有一种简单的方法来提取所有值task
?我应该转换为json
吗?
解决方案
go-yaml 希望您为该类型定义一个目标类型和一个解组器。
如果您想使用 key 提取某个地图中的所有值task
,您的类型将是任务名称列表。
对于该类型,您需要创建一个 unmarshaler 函数,该函数采用 YAML 文件的根节点并将任务名称提取到您定义的类型的对象中。
这是一个最小的工作示例:
package main
import (
"errors"
"fmt"
"gopkg.in/yaml.v3"
)
type Tasks struct {
items []string
}
// descend implements recursive descent into YAML mapping and sequence structures
func (t *Tasks) descend(node *yaml.Node) error {
switch node.Kind {
case yaml.SequenceNode:
for _, item := range(node.Content) {
t.descend(item)
}
case yaml.MappingNode:
for i := 0; i < len(node.Content); i += 2 {
key := node.Content[i]
value := node.Content[i+1]
if key.Kind != yaml.ScalarNode ||
key.Value != "task" {
t.descend(value)
continue
}
if value.Kind != yaml.ScalarNode {
return errors.New("encountered non-scalar task")
}
t.items = append(t.items, value.Value)
}
}
return nil
}
// UnmarshalYAML is the unmarshaler that will be called by the YAML processor.
func (t *Tasks) UnmarshalYAML(value *yaml.Node) error {
t.items = nil
return t.descend(value)
}
func main() {
var t Tasks
// I fixed some whitespace issues in your YAML input
if err := yaml.Unmarshal([]byte(`jobs:
- name: test
public: true
plan:
- try:
task: task1
file: test1.yaml
on_success:
in_parallel:
steps:
- task: task2
file: test2.yaml
- task: task3
file: task3.yaml`), &t); err != nil {
panic(err)
}
for _, item := range(t.items) {
fmt.Println(item)
}
}
输出:
task1
task2
task3
请注意,此解决方案通常不正确,因为 YAML 节点可能包含循环(由于 YAML 锚/别名),这将导致堆栈溢出,因为代码不检查循环。
推荐阅读
- c# - How do I add a css class when using new ListItem on databound?
- python - 在 IDLE 上使用 graphics.py 根本不起作用
- sas - SYSECHO SAS——应该发生什么?
- actions-on-google - Google 助理结束对话
- sql - SQL 以前的货币汇率
- go - 位于另一个项目的供应商文件夹中的供应商包
- typescript - Typescript 类在映射、过滤、查找等之后转换回对象
- javascript - Mailgun events API timestamp
- python - 将两个 numpy 数组打印为表格的最简单方法
- excel - 使用 select/case 从某个单元格中选择正确的日期,减去另一个单元格中列出的月份并输出到某个行、列