这个 Go Yaml 解释示例, https://gist.github.com/suntong001/74c85d15b19ef4b14b0e ,可以像这样解码一个简单的 YAML:
foo: 1
bar:
- one
- two
现在我想解释一个完全相同数据结构的数组,正确的做法是什么?
到目前为止,以下是我的代码,它没有按预期工作。请帮忙。
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
)
type Config struct {
Foo string
Bar []string
}
type Configs struct {
Cfgs []Config
}
var data = `
- foo: 1
bar:
- one
- two
- three
- foo: 2
bar:
- one1
- two2
- three3
`
func main() {
var config Configs
/*
filename := os.Args[1]
source, err := ioutil.ReadFile(filename)
if err != nil {
panic(err)
}
*/
source := []byte(data)
err := yaml.Unmarshal(source, &config)
if err != nil {
log.Fatalf("error: %v", err)
}
//fmt.Printf("Value: %#v\n", config.Bar[0])
fmt.Printf("--- config:\n%v\n\n", config)
}
更新:
Jfly 指出,要让它工作,只需将我的 var config Configs
替换为 var config []Config
,就可以了。现在我想如果将我的数据定义更改为以下内容,我上面的代码就可以工作了。
foobars:
- foo: 1
bar:
- one
- two
- three
- foo: 2
bar:
- one1
- two2
- three3
不,它没有。请帮忙。
最佳答案
示例 yaml 文件的内容是对象序列,所以这样做:
package main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
)
type Config struct {
Foo string
Bar []string
}
var data = `
- foo: 1
bar:
- one
- two
- three
- foo: 2
bar:
- one1
- two2
- three3
`
func main() {
var config []Config
/*
filename := os.Args[1]
source, err := ioutil.ReadFile(filename)
if err != nil {
panic(err)
}
*/
source := []byte(data)
err := yaml.Unmarshal(source, &config)
if err != nil {
log.Fatalf("error: %v", err)
}
//fmt.Printf("Value: %#v\n", config.Bar[0])
fmt.Printf("--- config:\n%v\n\n", config)
}
关于您更新的问题,您的代码几乎可以正常工作,只需像这样提示 yaml 解析器:
type Configs struct {
Cfgs []Config `foobars`
}
关于Go Yaml 解释示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30837357/