Golang解析yaml文件操作指南
作者:itsgopher 发布时间:2024-05-09 14:51:59
前言
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 中展现的 Marshall
和 Unmarshall
方法,他们会直接在结构体和字节流上进行操作。但有时我们为了图方便想把读取字节流这一步也交给组件去执行,这时候我们可以利用 yaml.Encoder
和 yaml.Decoder
。
yaml.Encoder
和 yaml.Decoder
在 io.Writer
和 io.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
来源:https://blog.csdn.net/ElzatAhmed/article/details/125769647


猜你喜欢
- 前言:Python 自带了很多的内置函数,极大地方便了我们的开发,下面就来挑几个内置函数,看看底层是怎么实现的。内置函数位于 Python/
- 一、安装cuda1、在英伟达官网下载最新版的cuda驱动https://developer.nvidia.com/zh-cn/cuda-do
- 本文实例讲述了mysql索引基数概念与用法。分享给大家供大家参考,具体如下:Cardinality(索引基数)是mysql索引很重要的一个概
- 在python显示图象时,我们用matplotlib模块时会遇到图像色彩失真问题,究竟是什么原因呢,下面就来看看究竟。待显示图像为:impo
- 死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.
- 目录主要解决的问题一、后端返回的数据,提交到后端的数据格式如下:二、vue前端代码如下:总结主要解决的问题1、vue在循环的时候需要动态绑定
- 本文实例为大家分享了由Python编写的MySQL管理工具的具体代码,供大家参考,具体内容如下import pymysqlimport pa
- 对于数据库管理员来说,可以经常想了解一些之前未听说过的存储过程,特别是无文档类型的存储过程。或许是用这些存储过程,能够简化日常的数据管理。为
- 本文使用TensorFlow实现最简单的线性回归模型,供大家参考,具体内容如下线性拟合y=2.7x+0.6,代码如下:import tens
- PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,L
- 本文针对Python的全局变量实现方法简述如下:先来看下面一段测试程序:count = 0def Fuc(count): pri
- 内容摘要合理使用渐变留白网格布局提高字体应用明确而有效的导航设计漂亮、有用的页脚介绍优秀设计和卓越设计之间的区别是比较小的。一般人可能无法解
- /*Bresenham画圆算法*/var arc = function(x0,y0,r){/*起点坐标x0,y
- 本教程为大家分享了win10下Python环境安装配置教程,供大家参考,具体内容如下1.在https://www.python.org/do
- 前言在做项目的时候一些配置文件都会写在settings配置文件中,今天在研究"州的先生"开源文档写作系统-MrDoc的时
- 参考官网地址:Windows端:https://tensorflow.google.cn/install/source_windowsCPU
- Js代码:vartempForm=document.createElement("form"); tempF
- 前言: 上一篇讲了Python排序问题中比较经典的三个方法,(链接:关于Python排
- 今天带你们去研究一个有趣的东西,文字识别OCR。不知道你们有没有想要识别图片,然后读出文字的功能。例如验证码,如果需要自动填写的话就需要这功
- DateTimeField日期+时间。与python里的 datetime.datetime 实例同。比如,数据库字段内容为2018-08-