示例
使用升级后的 版本 3 的 yaml 包。
一个示例的 conf.yaml
文件:
conf:
hits: 5
time: 5000000
camelCase: sometext
main.go
文件:
package main
import (
"fmt"
"io/ioutil"
"log"
"gopkg.in/yaml.v3"
)
type myData struct {
Conf struct {
Hits int64
Time int64
CamelCase string `yaml:"camelCase"`
}
}
func readConf(filename string) (*myData, error) {
buf, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
c := &myData{}
err = yaml.Unmarshal(buf, c)
if err != nil {
return nil, fmt.Errorf("in file %q: %w", filename, err)
}
return c, err
}
func main() {
c, err := readConf("conf.yaml")
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v", c)
}
运行指南(如果这是您第一次离开 stdlib):
cat conf.yaml
go mod init example.com/whatever
go get gopkg.in/yaml.v3
cat go.sum
go run .
关于yaml:"field"
在所有小写的 YAML 键标识符中,标签(如 yaml:"field"
)都是可选的。以上示例演示了解析额外的驼峰命名标识符,需要使用此类标签。
特殊情况:JSON+YAML
令人困惑的是,yaml
包有用的小写行为在标准的 json
包中并没有体现出来。您是否有一种数据结构,有时编码为 JSON,有时编码为 YAML?如果是这样,请考虑在每个字段上指定 JSON 标签和 YAML 标签。虽然冗长,但可以减少错误。下面是一个示例:
type myData struct {
Conf conf `yaml:"conf" json:"conf"`
}
type conf struct {
Hits int64 `yaml:"hits" json:"hits"`
Time int64 `yaml:"time" json:"time"`
CamelCase string `yaml:"camelCase" json:"camelCase"`
}
package main
、导入的文件、main
函数等等,这样其他人就可以轻松地复制粘贴代码并在本地运行。请考虑添加信息和代码,使人们更容易帮助你,因为你需要他人的帮助。 - Amit Kumar Gupta