Golang解析yaml文件操作指南

 更新时间:2022年09月07日 11:33:49   作者:itsgopher  
之前一直从事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 依赖:

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

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

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 文件去编写我们的配置:

a: 1
b: "I am B"
c: true
d:
  - "I"
  - "am"
  - "D"
e:
  ea: "I am EA"
  eb: "I am EB"

第四步,编写 main 函数:

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

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

➜  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 上进行操作读取其字节流并执行编码和解码的动作。我们将上面的例子以这种方法再次实现一遍:

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

运行结果:

➜  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文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go环境变量配置,及GOROOT、GOPATH的区别小结

    Go环境变量配置,及GOROOT、GOPATH的区别小结

    本文主要介绍了Go环境变量配置,及GOROOT、GOPATH的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • 为什么不建议在go项目中使用init()

    为什么不建议在go项目中使用init()

    这篇文章主要介绍了为什么不建议在go项目中使用init(),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Go语言特点及基本数据类型使用详解

    Go语言特点及基本数据类型使用详解

    这篇文章主要为大家介绍了Go语言特点及基本数据类型使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 掌握GoLang Fiber路由和中间件技术进行高效Web开发

    掌握GoLang Fiber路由和中间件技术进行高效Web开发

    这篇文章主要为大家介绍了GoLang Fiber路由和中间件进行高效Web开发,本文将深入探讨 Fiber 中的路由细节,学习如何创建和处理路由,深入了解使用路由参数的动态路由,并掌握在 Fiber 应用程序中实现中间件的艺术
    2024-01-01
  • Golang中的错误处理的示例详解

    Golang中的错误处理的示例详解

    这篇文章主要为大家详细介绍了Golang中的错误处理的相关资料,文章中的示例代码讲解详细,对我们学习Golang有一定帮助,需要的可以参考一下
    2022-11-11
  • 完美解决golang go get私有仓库的问题

    完美解决golang go get私有仓库的问题

    这篇文章主要介绍了完美解决golang go get私有仓库的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言题解LeetCode35搜索插入位置示例详解

    Go语言题解LeetCode35搜索插入位置示例详解

    这篇文章主要为大家介绍了Go语言题解LeetCode35搜索插入位置示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言context上下文管理的使用

    Go语言context上下文管理的使用

    本文主要介绍了Go语言context上下文管理的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • go开发过程中mapstructure使用示例详解

    go开发过程中mapstructure使用示例详解

    mapstructure是一个Go语言库,用于将映射(如map或struct)解码为结构体,便于处理JSON、YAML等配置文件数据,通过字段名或结构体标签控制解码,支持嵌套结构体、灵活处理多种数据源,需要注意错误处理,该库适合于Go开发中配置数据的读取和转换
    2024-10-10
  • Golang中如何实现枚举详析

    Golang中如何实现枚举详析

    举就是将数据值一一列出来,枚举可以用来表示一些固定的值,枚举是常量组成的,下面这篇文章主要给大家介绍了关于Golang中如何实现枚举的相关资料,需要的朋友可以参考下
    2022-07-07

最新评论