2 回答
TA贡献1831条经验 获得超9个赞
由于您的数据是一个数组,因此请将其取消封送至结构数组。YAMLConfig
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
type Config struct {
Foo string
Bar string
}
func main() {
var configs []Config
var data = `
- foo: 1
bar: 2
`
err := yaml.Unmarshal([]byte(data), &configs)
if err != nil {
panic(err)
}
fmt.Println(configs)
}
输出:
[{1 2}]
试穿 - 去游乐场
TA贡献1827条经验 获得超4个赞
由于这个问题已经得到回答,我想我可以在讨论中添加一些东西:
var data = `
- foo: 1
bar: 2
`
此处的数据变量(即您编写的方式)将包括每行开头的缩进。
这里的额外缩进将与所有实际的 yaml 数据一起传递,这可能会把事情搞砸,因为 gofmt 将代码格式化为使用 TAB 作为缩进,并且 yaml 中禁止 TAB 缩进(https://stackoverflow.com/a/19976827/7509248)。yaml.Unmarshal()
如果您在 yaml 中使用 tab 作为缩进,则在尝试取消封送时会引发这样的错误:
yaml: line 1: found a tab character that violates indentation
最好是从单独的文件加载以避免此类问题。data
package main
import (
"fmt"
"io/ioutil"
"gopkg.in/yaml.v2"
)
type Config struct {
Foo string
Bar string
}
func main() {
var configs []Config
source, err := ioutil.ReadFile("config.yaml")
if err != nil {
fmt.Printf("failed reading config file: %v\n", err)
}
err = yaml.Unmarshal(source, &configs)
if err != nil {
fmt.Printf("error: %v\n", err)
}
fmt.Printf("config:\n%+v\n", configs)
}
config.yaml:
- foo: 1
bar: 2
输出:
config:
[{Foo:1 Bar:2}]
- 2 回答
- 0 关注
- 98 浏览
添加回答
举报