为了账号安全,请及时绑定邮箱和手机立即绑定

解析地图的 yaml 错误

解析地图的 yaml 错误

Go
繁花不似锦 2023-03-21 15:41:39
我有以下程序,我需要在其中解析具有以下结构的 yamlhttps://codebeautify.org/yaml-validator/cbabd352 这是有效的 yaml,我使用 byte 使其更简单,也许在复制粘贴到问题期间更改了缩进,但您可以在链接中看到 yaml 有效yaml 有一个 api_version 和跑步者,对于每个跑步者(键是名称)我有一个命令列表,我需要打印这些命令,function1我function4在这里做错了什么?package mainimport (    "fmt"    "log"    "gopkg.in/yaml.v2")var runContent = []byte(`api_ver: 1runners: - name: function1   type:    - command: spawn child process    - command: build    - command: gulp - name: function2   type:    - command: run function 1 - name: function3   type:    - command: ruby build - name: function4   type:    - command: go build`)type Result struct {    Version string    `yaml:"api_ver"`    Runners []Runners `yaml:"runners"`}type Runners struct {    Name string    `yaml:"name"`    Type []Command `yaml:"type"`}type Command struct {    Command string `yaml:"command"`}func main() {    var runners []Result    err := yaml.Unmarshal(runContent, &runners)    if err != nil {        log.Fatalf("Error : %v", err)    }    fmt.Printf("%+v", runners[0])}我得到的错误cannot unmarshal !!map into []main.Result我无法更改 yaml,它应该完全像这样https://codebeautify.org/yaml-validator/cbabd352这是代码 https://play.golang.org/p/zidjOA6-gc7
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

您提供的 yaml 包含令牌错误。在此处验证代码中使用的 yaml https://codebeautify.org/yaml-validator/cbaabb32

之后创建结构类型结果的变量而不是数组。因为您使用的 yaml 正在创建一个带有 Runners 数组和 api_version 的结构。

var runners []Result

应该

var runners Result

因为因为结构不是切片。获取 yaml 中使用的函数名称的命令列表。您需要遍历 runners 数组以找到函数名称并获取该函数的命令值。下面是工作代码:

package main


import (

    "fmt"

    "log"


    "gopkg.in/yaml.v2"

)


var runContent = []byte(`

api_ver: 1

runners:

  - name: function1

    type:

    - command: spawn child process

    - command: build

    - command: gulp

  - name: function2

    type:

    - command: run function 1

    - name: function3

    type:

    - command: ruby build

  - name: function4

    type:

  - command: go build

`)


type Result struct {

    Version string    `yaml:"api_ver"`

    Runners []Runners `yaml:"runners"`

}


type Runners struct {

    Name string    `yaml:"name"`

    Type []Command `yaml:"type"`

}


type Command struct {

    Command string `yaml:"command"`

}


func main() {


    var runners Result

    // parse mta yaml

    err := yaml.Unmarshal(runContent, &runners)

    if err != nil {

        log.Fatalf("Error : %v", err)

    }

    commandList := getCommandList("function1", runners.Runners)

    fmt.Printf("%+v", commandList)

}


func getCommandList(name string, runners []Runners) []Command {

    var commandList []Command

    for _, value := range runners {

        if value.Name == name {

            commandList = value.Type

        }

    }

    return commandList

}

游乐场示例


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信