Golang 解析Yaml格式
Golang官方并没有提供Yaml解析包,所以需要使用第三方包。可用的第三方包有不少,这里选择的是
gopkg.in/yaml.v2,这个包在github上有不少的star,也的确挺好用。其使用的是Apache License。
这个包提供的函数还是很少了,这真是一件好事(〃∀〃)
如果你不了解yaml,查看YAML简要入门
func Marshal(in interface{}) (out []byte, err error)
将提供的对象解析为YAML文档格式。
但要注意这里返回不是string类型
func Unmarshal(in []byte, out interface{}) (err error)
解析给定的字节切片,存储在第二参数中。你必须保证存储类型可以接受被解析的数据,否则yaml.TypeError将被返回
让我们来看一下这个例子:
package mainimport ("fmt""gopkg.in/yaml.v2"
)func main() {var t Ts := `a: 1
x: 333
B: 2
F:c: 3
开心: 10
愉悦: 30
S: 9
`yaml.Unmarshal([]byte(s), &t) //输出为{0 1 0 0 0 0 30 333 0}//a不会获得值,说明 结构字段名首字母大小控制是否接受值,首字母大写为接受//b和B都没有获得值,未设置键时,默认解析时会将struct中字段的首字母转为小写,再去匹配Yaml,//这样就没有能与yaml中B想匹配的了//C 不能获得值说明,对应层次的字段才会赋值//开心与D的例子,显示如何使用中文作为键//X可以获得值说明,解析与声明的顺序无关fmt.Println(t)
}type T struct {a intA int //yaml中a的值会给哪一个?b intB int //yaml中B的值会给B还是b,或者两者都不?C int //能获得yaml中c的值吗?开心 int //能获得yaml开心的值吗?D int `yaml:"愉悦"` //使用struct标签,为D int设置键为“愉悦”//`yaml:"key[, tag]"`X int //X能获得值吗s int `yaml:"S"`
}
你可以拷贝运行一下这段代码,自己感受下。
如果如何struct中还有struct呢?
package mainimport ("fmt""log""gopkg.in/yaml.v2"
)type StructA struct {A string `yaml:"a"`
}type StructB struct {StructAC StructAB string `yaml:"b"`
}var data = `
a: a string from struct A
b: a string from struct B
c:a: a string from c.a
`func main() {var b StructBerr := yaml.Unmarshal([]byte(data), &b)if err != nil {log.Fatalf("cannot unmarshal data: %v", err)}fmt.Println(b.B)fmt.Println(b.A)fmt.Println(b.C.A)/*输出为:a string from struct B //可以看到匿名struct没有获得值a string from c.a*/
}
要为匿名结构也作为YAML的一部分解析,需要inline
标记
type StructB struct {StructA`yaml:",inline"`C StructAB string `yaml:"b"`
}
func UnmarshalStrict(in []byte, out interface{}) (err error)
UnmarshalStrict和Unmarshal基本上一样,但是多了一点限制。
Yaml中的字段必须要有给定的接收对象,而在Unmarshal中它们会被忽略。
type Decoder
Decoder从输入流中读取和解析YAML值
func NewDecoder(r io.Reader) *Decoder
使用r创建Decoder
func (dec *Decoder) Decode(v interface{}) (err error)
从YAML中解析v的值
package mainimport ("fmt""os""gopkg.in/yaml.v2"
)type StructA struct {A string `yaml:"a"`
}type StructB struct {StructAC StructAB string `yaml:"b"`
}func main() {var b StructByfile, _ := os.Open("test.yaml") //test.yaml由下一个例子生成defer yfile.Close()ydecode:= yaml.NewDecoder(yfile)ydecode.Decode(&b) //注意这里为指针fmt.Println(b)
}
type Encoder
编码并将YAML写入输出流
func NewEncoder(w io.Writer) *Encoder
返回一个写入r中的Encoder
Encoder带有缓冲,所以一定记得调用func (e *Encoder) Close() (err error)
,以防数据未写入
func (e *Encoder) Encode(v interface{}) (err error)
编码v并写入流,如果多次调用,每次存入的YAML以---
分隔
package mainimport ("log""os""gopkg.in/yaml.v2"
)type StructA struct {A string `yaml:"a"`
}type StructB struct {StructAC StructAB string `yaml:"b"`
}var data = `
a: a string from struct A
b: a string from struct B
c:a: a string from c.a
`func main() {var b StructBx := 22err := yaml.Unmarshal([]byte(data), &b)if err != nil {log.Fatalf("cannot unmarshal data: %v", err)}yfile, _ := os.Create("test.yaml")defer yfile.Close()yencoder := yaml.NewEncoder(yfile)defer yencoder.Close()yencoder.Encode(b)yencoder.Encode(b)yencoder.Encode(x)yencoder.Encode(44)
}
这篇文章根据官方文档写成,我可能没有表述的很清楚,请查阅官方文档
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。转载请注明出处!
转载于:https://www.cnblogs.com/xiyu714/p/9903640.html
Golang 解析Yaml格式相关推荐
- Golang解析yaml格式文件
关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! 作者:会飞的鲶鱼 链接:Golang解析yaml格式文件 - 简书 來源:简书 简书著作权归作者所有,任何形式的转载都请联系 ...
- golang解析嵌套yaml配置(局部解析)
golang中解析yaml配置文件 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Ra ...
- go 写入yaml_golang使用yaml格式解析构建配置文件
现在主流的配置文件格式有这么几种,xml.yaml.config- xml就算了,太挫了,太土, 太繁琐- config 就是mysql,apache my.cnf的那种格式,这个格式适合功能分层, ...
- C++ yaml解析实战暨yaml-cpp库使用(1)认识yaml格式
文章目录 介绍 基本语法 数据类型 YAML 对象 YAML 数组 复合结构 纯量 引用 介绍 YAML("YAML Ain't a Markup Language")是一种轻量级 ...
- symfony入门学习资料之九:YAML格式介绍
symfony入门学习资料之九:YAML格式介绍 由于EDUSOHO的项目原因,中断了对symfony框架的继续学习,今天回顾了前面的总结,总结了八节.从建立简单的页面.控制器.路由.模板等,甚至包括 ...
- 如何在Python中解析YAML文件
如何在Python中解析YAML文件? #1楼 不依赖C标头的最简单,最纯净的方法是PyYaml( 文档 ): #!/usr/bin/env pythonimport yamlwith open(&q ...
- 如何编写yaml格式的Ansible主机清单(inventory)及清单变量使用Demo
写在前面 嗯,学习Ansible高级特性,整理这部分笔记 博文内容涉及: ini&yaml格式的inventory相互转化 inventory 中的变量管理Demo inventory 常见报 ...
- go解析yaml文件示例
yaml文件已经成为配置的一种主要格式,因此各种语言都提供了相应的解析类库, 本文就以go语言中常用的yaml解析库 gopkg.in/yaml为例,简单展示一下如何解析yaml文件 具体代码在这里: ...
- python yaml dump_使用Python处理yaml格式的数据简单到爆!
一.思考:question::grey_question: 1.什么是yaml? Python资源共享群:626017123不是标记语言 对用户极其友好 数据序列化标准 跨语言 所有编程语言都支持 跨 ...
最新文章
- UE4材质着色器全面学习教程
- 面试--java实现一个多人图文聊天室(c/s或b/s),写出思路
- pythreejs is needed for plotting with pythreejs backend
- Cocos 2d-x 3.3版本升级 五大维度提升3D品质
- 计算机竞赛游戏探险岛,冒险岛2五大全新团本综合分析
- 最新,使用truffle框架之后,安装ipfs的api包文件的命令变化
- Facebook轮播连结广告可展示5个图像与连结
- 通用测绘成果质检软件
- 【原创】使用blockUI制作自定义的漂亮的网页提示框(代替confirm和alert)
- leetcode讲解--937. Reorder Log Files
- pr cpu100%_【Premiere】视频剪辑必装插件,5个PR插件推荐
- JAVA 类和对象的实例
- OpenStack安装CentOS镜像:Device eth0 does not seem to be present, delaying initialization
- python这个怎么读-python怎么读(python怎么读中文)
- 目标定位算法(三)之基于角度的定位算法
- 逻辑回归的参数计算:牛顿法,梯度下降法,随机梯度下降法
- 如何使用predict()输出预测结果 以及 输出值转换为0/1值。
- 微信小游戏子域中请求微信头像,cocos create会自动添加前缀的问题
- Catia 二次开发 资料
- Qt数据库应用22-文件编码格式识别
热门文章
- 360官网上下载不同版本的浏览器
- 公司内部资料!游戏上线前部署准备,就这新手都行
- systemctl重新加载_如何使用systemctl重新启动服务
- mysql delimiter 无效_MySQL“DELIMITER”关键字不起作用
- scp command
- android 哪个服务提示 存储设备空间不足,请释放一些空间,手机出现空间不足,至少需要449.93MB手机存储空间怎么办...
- 2022年安全员-A证考试题库及在线模拟考试
- 计算机应用制作ppt,计算机应用基础_幻灯片制作.ppt
- android手机删除应用程序未安装失败,软件安装未成功,手机内存减少之解决方法(安卓)...
- git mr 怎样合并部分_系统掌握Git之—分离头指针与合并操作