系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 脚本中心 > 其它 > 详细页面

Golang解析yaml文件操作指南

时间:2022-09-12来源:www.pcxitongcheng.com作者:电脑系统城

前言

yaml 文件是研发人员最常用的配置文件,yaml 文件的树形结构一直很受大家的欢迎。有过 SpringBoot 开发经验的同学对 yaml 非常熟悉,SpringBoot 整个项目的运行就需要一个 application.yaml 文件的支持,那么 Golang 项目中的 yaml 文件是如何解析的呢?Let`s dive in!

PS:根据 godocs 的说法,Golang 有三个强大的工具包支持 yaml 文件的解析,分别是:go-gypsy go-yaml goccy-yaml。本文中我们将讨论其中 go-yaml 的用法。

对 yaml 解析源码感兴趣的同学请进入:go-yaml源码链接

Simple Demo

第一步,我们创建好项目后导入 go-yaml 依赖:

1
2
➜  go-yaml go get gopkg.in/yaml.v3
go: added gopkg.in/yaml.v3 v3.0.1

第二步,创建 main 文件并在内部编写一个简单的结构体:

1
2
3
4
5
6
7
8
9
10
11
type ConfDemo struct {
  // 后面的 yaml 注解是在 yaml 文件中的属性名
    A int      `yaml:"a"`
    B string   `yaml:"b"`
    C bool     `yaml:"c"`
    D []string `yaml:"d"`
    E struct {
        EA string `yaml:"ea"`
        EB string `yaml:"eb"`
    } `yaml:"e"`
}

第三步,在主目录下创建 conf 目录,并在 conf 目录下创建 conf_demo.yaml 文件去编写我们的配置:

1
2
3
4
5
6
7
8
9
10
a: 1
b: "I am B"
c: true
d:
  - "I"
  - "am"
  - "D"
e:
  ea: "I am EA"
  eb: "I am EB"

第四步,编写 main 函数:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func main() {
  // 读取文件所有内容装到 []byte 中
    bytes, err := ioutil.ReadFile("config/conf_demo.yaml")
    if err != nil {
        log.Fatalln(err)
    }
  // 创建配置文件的结构体
    var confDemo ConfDemo
  // 调用 Unmarshall 去解码文件内容
  // 注意要穿配置结构体的指针进去
    err = yaml.Unmarshal(bytes, &confDemo)
    if err != nil {
        log.Fatalln(err)
    }
  // 调用 Unmarshall 对解码出来的 confDemo 进行编码
  // 返回的 yml 是 []byte 类型的
  yml, err := yaml.Marshal(confDemo)
    if err != nil {
        log.Fatalln(err)
    }
  // 输出结果
    fmt.Printf("%#v\n", confDemo)
  fmt.Printf("%s\n", yml)
}

第五步,运行并查看结果:

1
2
3
4
5
6
7
8
9
10
11
12
➜  go-yaml go run main.go
main.ConfDemo{A:1, B:"I am B", C:true, D:[]string{"I", "am", "D"}, E:struct { EA string "yaml:\"ea\""; EB string "yaml:\"eb\"" }{EA:"I am EA", EB:"I am EB"}}
a: 1
b: I am B
c: true
d:
    - I
    - am
    - D
e:
    ea: I am EA
    eb: I am EB

go-yaml 其他解析方法

第一种解析方法即 simple Demo 中展现的 Marshall 和 Unmarshall 方法,他们会直接在结构体和字节流上进行操作。但有时我们为了图方便想把读取字节流这一步也交给组件去执行,这时候我们可以利用 yaml.Encoder 和 yaml.Decoder

yaml.Encoder 和 yaml.Decoder 在 io.Writer 和 io.Reader 上进行操作读取其字节流并执行编码和解码的动作。我们将上面的例子以这种方法再次实现一遍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func main() {
  // 利用 os.Open 获取 File 对象,该对象实现了 io.Reader 和 io.Writer
    file, err := os.Open("config/conf_demo.yaml")
    if err != nil {
        log.Fatalln(err)
    }
  // 构造新的 Decoder,并传入 file
    decoder := yaml.NewDecoder(file)
  // 配置文件结构体
    var confDemo ConfDemo
  // 解码操作,注意要传入地址
    err = decoder.Decode(&confDemo)
  // 输出解码结果
    fmt.Printf("%#v\n", confDemo)
    if err != nil {
        log.Fatalln(err)
    }
  // 构造新的 Encoder,这里直接传入了 os.Stdout,代表结果直接输出到控制台
    encoder := yaml.NewEncoder(os.Stdout)
  // 编码并输出
    err = encoder.Encode(confDemo)
    if err != nil {
        log.Fatalln(err)
    }
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
➜  go-yaml go run main.go
main.ConfDemo{A:1, B:"I am B", C:true, D:[]string{"I", "am", "D"}, E:struct { EA string "yaml:\"ea\""; EB string "yaml:\"eb\"" }{EA:"I am EA", EB:"I am EB"}}
a: 1
b: I am B
c: true
d:
    - I
    - am
    - D
e:
    ea: I am EA
    eb: I am EB

总结

到此这篇关于Golang解析yaml文件操作的文章就介绍到这了

分享到:

相关信息

  • 如何使用python统计字符在文件中出现的次数

    一、本项目来源: 二、先上传自己写的程序 三、解读程序语句。 四、程序运行效果 五、程序中需要注意的事...

    2023-03-09

  • Go中数组传参的几种方式小结

    本文主要介绍了Go中数组传参的几种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    2023-03-09

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载