如何读取 YAML 文件

新手上路,请多包涵

我在读取 YAML 文件时遇到问题。我认为这是文件结构中的一些东西,但我不知道是什么。

YAML 文件:

 conf:
  hits:5
  time:5000000

代码:

 type conf struct {
    hits int64 `yaml:"hits"`
    time int64 `yaml:"time"`
}

func (c *conf) getConf() *conf {

    yamlFile, err := ioutil.ReadFile("conf.yaml")
    if err != nil {
        log.Printf("yamlFile.Get err   #%v ", err)
    }
    err = yaml.Unmarshal(yamlFile, c)
    if err != nil {
        log.Fatalf("Unmarshal: %v", err)
    }

    return c
}

原文由 MIkCode 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 366
2 个回答

你的 yaml 文件必须是

hits: 5
time: 5000000

你的代码应该是这样的:

 package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
    "io/ioutil"
    "log"
)

type conf struct {
    Hits int64 `yaml:"hits"`
    Time int64 `yaml:"time"`
}

func (c *conf) getConf() *conf {

    yamlFile, err := ioutil.ReadFile("conf.yaml")
    if err != nil {
        log.Printf("yamlFile.Get err   #%v ", err)
    }
    err = yaml.Unmarshal(yamlFile, c)
    if err != nil {
        log.Fatalf("Unmarshal: %v", err)
    }

    return c
}

func main() {
    var c conf
    c.getConf()

    fmt.Println(c)
}

主要错误是您的结构的大写字母。

原文由 qwertmax 发布,翻译遵循 CC BY-SA 4.0 许可协议

例子

使用 yaml 包的升级 版本 3

一个例子 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:"field" )对于全小写的 yaml 密钥标识符是可选的。为了演示,上面的示例解析了一个额外的 驼峰式 标识符,它确实需要这样一个标签。

极端情况:JSON+YAML

令人困惑的是,在标准 json中看 不到 yaml 包的有用小写行为。您是否有一个有时编码为 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"`
}

原文由 kubanczyk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏