Go语言 如何读取YAML文件

cyej8jka  于 2023-09-28  发布在  Go
关注(0)|答案(4)|浏览(123)

我在阅读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
}
z4bn682m

z4bn682m1#

您的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)
}

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

cedebl8k

cedebl8k2#

示例

使用升级的版本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:"field")对于全小写的yaml密钥标识符是可选的。为了演示,上面的示例解析了一个额外的camel case标识符,它确实需要这样的标记。

边角案例: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"`
}
9jyewag0

9jyewag03#

package main

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

type someConf struct {
    AccessKeyID     string `yaml:"access_key_id"`
   //...
}

func getConf(file string, cnf interface{}) error {
   yamlFile, err := ioutil.ReadFile(file)
   if err == nil {
      err = yaml.Unmarshal(yamlFile, cnf)
   }
   return err
}

func main() {
    cfg := &awsConf{}
    if err := getConf("conf.yml", cfg); err != nil {
        log.Panicln(err)
    }
 }

最短getConf

wh6knrhe

wh6knrhe4#

在这里,您可以在没有预定义结构的情况下读取YAML文件。请将“config.yaml”替换为所需的文件名。将“fmt”、“io/ioutil”和“gopkg.in/yaml.v2“添加到导入列表中。

package main

    import (
        "fmt"
        "io/ioutil"

        "gopkg.in/yaml.v2"
    )

    func main() {
        obj := make(map[string]interface{})
    
        yamlFile, err := ioutil.ReadFile("config.yaml")
        if err != nil {
          fmt.Printf("yamlFile.Get err #%v ", err)
        }
        err = yaml.Unmarshal(yamlFile, obj)
        if err != nil {
          fmt.Printf("Unmarshal: %v", err)
        }

        fmt.Println(obj)
    }

相关问题