我有一个类似Yaml的代码,需要使用go进行解析。 当我尝试运行带有解析的代码时,出现错误。 下面是代码:
var runContent= []byte(`
- runners:
- name: function1
type: func1
- command: spawn child process
- command: build
- command: gulp
- name: function1
type: func2
- command: run function 1
- name: function3
type: func3
- command: ruby build
- name: function4
type: func4
- command: go build
`)
这些是类型:
type Runners struct {
runners string `yaml:"runners"`
name string `yaml:”name”`
Type: string `yaml: ”type”`
command [] Command
}
type Command struct {
command string `yaml: ”command”`
}
runners := Runners{}
err = yaml.Unmarshal(runContent, &runners)
if err != nil {
log.Fatalf("Error : %v", err)
}
当我尝试解析它时,出现错误invalid map
,这里可能缺少什么?
答案 0 :(得分:1)
您发布的代码包含多个错误,包括结构字段Type
。您代码中提供的yaml无效。将yaml解组为struct时,这会导致err。
在解组Yaml时,要求:
解码值的类型应与 各自的值都出来了。如果由于一个或多个值而无法解码 如果类型不匹配,则解码将部分继续,直到 YAML内容,并返回* yaml.TypeError及其详细信息 所有缺失的值。
与此相关:
仅在导出结构字段时才对其进行编组(具有 大写的首字母),并且使用字段名称取消编组 小写为默认键。
在定义包含空格的yaml
标签时也出错。可以通过字段标签中的“ yaml”名称定义自定义键:第一个逗号之前的内容用作键。
type Runners struct {
runners string `yaml:"runners"` // fields should be exportable
name string `yaml:”name”`
Type: string `yaml: ”type”` // tags name should not have space in them.
command [] Command
}
要使结构可导出,请将结构和字段转换为大写的起始字母,并在yaml标记名称中删除空格:
type Runners struct {
Runners string `yaml:"runners"`
Name string `yaml:"name"`
Type string `yaml:"type"`
Command []Command
}
type Command struct {
Command string `yaml:"command"`
}
按如下所示修改代码以使其正常工作。
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
)
var runContent = []byte(`
- runners:
- name: function1
type:
- command: spawn child process
- command: build
- command: gulp
- name: function1
type:
- command: run function 1
- name: function3
type:
- command: ruby build
- name: function4
type:
- command: go build
`)
type Runners []struct {
Runners []struct {
Type []struct {
Command string `yaml:"command"`
} `yaml:"type"`
Name string `yaml:"name"`
} `yaml:"runners"`
}
func main() {
runners := Runners{}
// parse mta yaml
err := yaml.Unmarshal(runContent, &runners)
if err != nil {
log.Fatalf("Error : %v", err)
}
fmt.Println(runners)
}
在此处https://codebeautify.org/yaml-validator/cb92c85b在线验证您的Yaml