Golang从yaml文件中提取值
我想从这个yaml中提取Golang从yaml文件中提取值,go,yaml,Go,Yaml,我想从这个yaml中提取task的值。这很棘手,因为它可能位于文件中的不同路径。除了上面的task可以在yaml文件中找到的路径之外,还有一些不同的路径。是否有一种简单的方法可以提取任务的所有值?我是否应该转换为json?go yaml希望您为该类型定义一个目标类型和一个解组器 如果您想使用键task提取某个映射中的所有值,您的类型将是任务名称列表 对于该类型,您需要创建一个unmarshaler函数,该函数接受YAML文件的根节点,并将任务名称提取到您定义的类型的对象中 下面是一个简单的工作示
task
的值。这很棘手,因为它可能位于文件中的不同路径。除了上面的task
可以在yaml文件中找到的路径之外,还有一些不同的路径。是否有一种简单的方法可以提取任务
的所有值?我是否应该转换为json
?go yaml希望您为该类型定义一个目标类型和一个解组器
如果您想使用键task
提取某个映射中的所有值,您的类型将是任务名称列表
对于该类型,您需要创建一个unmarshaler函数,该函数接受YAML文件的根节点,并将任务名称提取到您定义的类型的对象中
下面是一个简单的工作示例:
主程序包
进口(
“错误”
“fmt”
“gopkg.in/yaml.v3”
)
类型任务结构{
items[]字符串
}
//descent在YAML映射和序列结构中实现递归下降
函数(t*任务)下降(节点*yaml.node)错误{
切换节点。种类{
案例yaml.SequenceNode:
对于_,项:=范围(node.Content){
t、 下降(项目)
}
案例yaml.MappingNode:
对于i:=0;i
输出:
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
请注意,此解决方案通常不正确,因为YAML节点可能包含循环(由于YAML锚/别名),这将导致堆栈溢出,因为代码没有检查循环。go YAML希望您为该类型定义目标类型和解组器 如果您想使用键
task
提取某个映射中的所有值,您的类型将是任务名称列表
对于该类型,您需要创建一个unmarshaler函数,该函数接受YAML文件的根节点,并将任务名称提取到您定义的类型的对象中
下面是一个简单的工作示例:
主程序包
进口(
“错误”
“fmt”
“gopkg.in/yaml.v3”
)
类型任务结构{
items[]字符串
}
//descent在YAML映射和序列结构中实现递归下降
函数(t*任务)下降(节点*yaml.node)错误{
切换节点。种类{
案例yaml.SequenceNode:
对于_,项:=范围(node.Content){
t、 下降(项目)
}
案例yaml.MappingNode:
对于i:=0;i
输出:
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
请注意,此解决方案通常不正确,因为YAML节点可能包含循环(由于YAML锚/别名),这将导致堆栈溢出,因为代码没有对照循环进行检查。什么是
task
的“值”,尽管这里有三个不同的task
键;你认为他们中的哪一个是“价值”?到目前为止,您尝试了什么?如果您知道如何使用json
,您也可以这样做,但对于yaml
(您的文件格式):是一个良好的开端point@Jorropo我可以很容易地将其转换为JSON。您将如何在JSON中执行此操作?@EliBendersky需要所有这些task
键的值。我尝试使用YAML解组器,但遇到了问题,因为我无法定义解组器的结构,因为任务
键可能出现在文件中的许多不同位置;你认为他们中的哪一个是“价值”?到目前为止,您尝试了什么?如果您知道如何使用json
,您也可以这样做,但对于yaml
(您的文件格式):是一个良好的开端point@Jorropo我可以很容易地将其转换为JSON。您将如何在JSON中执行此操作?@EliBendersky需要所有这些task
键的值。我试图做一个YAML解编器,但遇到了问题