脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Golang解析yaml文件操作指南

Golang解析yaml文件操作指南

2022-09-08 17:21itsgopher Golang

之前一直从事java开发,习惯了使用yaml文件的格式,尤其是清晰的层次结构、注释,下面这篇文章主要给大家介绍了关于Golang解析yaml文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

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 中展现的 MarshallUnmarshall 方法,他们会直接在结构体和字节流上进行操作。但有时我们为了图方便想把读取字节流这一步也交给组件去执行,这时候我们可以利用 yaml.Encoderyaml.Decoder

yaml.Encoderyaml.Decoderio.Writerio.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文件操作的文章就介绍到这了,更多相关Golang解析yaml文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/ElzatAhmed/article/details/125769647

延伸 · 阅读

精彩推荐
  • Golanggolang fmt占位符的使用详解

    golang fmt占位符的使用详解

    这篇文章主要介绍了golang fmt占位符的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    陈天刚9772021-02-27
  • GolangGolang学习笔记(二):类型、变量、常量

    Golang学习笔记(二):类型、变量、常量

    这篇文章主要介绍了Golang学习笔记(二):类型、变量、常量,本文讲解了基本类型、保留字、变量、常量、枚举、运算符、指针、分组声明等内容,需要的...

    Golang教程网2222020-04-26
  • GolangGolang并发操作中常见的读写锁详析

    Golang并发操作中常见的读写锁详析

    Golang中的锁机制主要包含互斥锁和读写锁互斥锁互斥锁是传统并发程序对共享资源进行控制访问的主要手段,这篇文章主要给大家介绍了关于Golang并发操作中...

    ReganYue11462021-09-17
  • GolangGo语言的数据结构转JSON

    Go语言的数据结构转JSON

    本文主要介绍了Go语言的数据结构转JSON,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    宇宙之一粟3452022-08-30
  • Golanggolang如何自定义json序列化应用详解

    golang如何自定义json序列化应用详解

    json格式可以算我们日常最常用的序列化格式之一了,下面这篇文章主要给大家介绍了关于golang如何自定义json序列化应用的相关资料,文中通过示例代码介...

    咖啡加方糖5102020-05-18
  • Golang利用Go语言搭建WebSocket服务端方法示例

    利用Go语言搭建WebSocket服务端方法示例

    这篇文章主要给大家介绍了利用Go语言搭建WebSocket服务端方法,文中通过示例代码介绍的非常详细,需要的朋友们可以参考借鉴,下面来一起看看吧。 ...

    小谈博客3522020-05-06
  • GolangGo语言基于Socket编写服务器端与客户端通信的实例

    Go语言基于Socket编写服务器端与客户端通信的实例

    这篇文章主要介绍了Go语言基于Socket编写服务器端与客户端通信的实例,包括实现基于自定义通讯协议的Socket通信,需要的朋友可以参考下 ...

    G1SLu3312020-08-13
  • Golanggo mod 使用旧版本 版本号指定方式

    go mod 使用旧版本 版本号指定方式

    这篇文章主要介绍了go mod 使用旧版本 版本号指定方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    gs801405962021-06-24