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

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

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文件操作的文章就介绍到这了

分享到:

相关信息

  • Go json反序列化“null“的问题解决

    有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map 1 2 3 4 5 6 7 8 9 10 11 12 13 14...

    2023-03-15

  • Golang 字符串转time类型实现

    由于数据库的类型为Data 类型,所以插入数据库的时候我先把前端传入的string类型的时间转为Time 再插入。 Go 提供了两种插入的方式,即time.Parse 和 time.ParseInLocation 。两种方式,他们的差异比较大。...

    2023-03-09

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载