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 DecoderDecoder从输入流中读取和解析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格式相关推荐

  1. Golang解析yaml格式文件

    关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! 作者:会飞的鲶鱼 链接:Golang解析yaml格式文件 - 简书 來源:简书 简书著作权归作者所有,任何形式的转载都请联系 ...

  2. golang解析嵌套yaml配置(局部解析)

    golang中解析yaml配置文件 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Ra ...

  3. go 写入yaml_golang使用yaml格式解析构建配置文件

    现在主流的配置文件格式有这么几种,xml.yaml.config-  xml就算了,太挫了,太土, 太繁琐- config 就是mysql,apache my.cnf的那种格式,这个格式适合功能分层, ...

  4. C++ yaml解析实战暨yaml-cpp库使用(1)认识yaml格式

    文章目录 介绍 基本语法 数据类型 YAML 对象 YAML 数组 复合结构 纯量 引用 介绍 YAML("YAML Ain't a Markup Language")是一种轻量级 ...

  5. symfony入门学习资料之九:YAML格式介绍

    symfony入门学习资料之九:YAML格式介绍 由于EDUSOHO的项目原因,中断了对symfony框架的继续学习,今天回顾了前面的总结,总结了八节.从建立简单的页面.控制器.路由.模板等,甚至包括 ...

  6. 如何在Python中解析YAML文件

    如何在Python中解析YAML文件? #1楼 不依赖C标头的最简单,最纯净的方法是PyYaml( 文档 ): #!/usr/bin/env pythonimport yamlwith open(&q ...

  7. 如何编写yaml格式的Ansible主机清单(inventory)及清单变量使用Demo

    写在前面 嗯,学习Ansible高级特性,整理这部分笔记 博文内容涉及: ini&yaml格式的inventory相互转化 inventory 中的变量管理Demo inventory 常见报 ...

  8. go解析yaml文件示例

    yaml文件已经成为配置的一种主要格式,因此各种语言都提供了相应的解析类库, 本文就以go语言中常用的yaml解析库 gopkg.in/yaml为例,简单展示一下如何解析yaml文件 具体代码在这里: ...

  9. python yaml dump_使用Python处理yaml格式的数据简单到爆!

    一.思考:question::grey_question: 1.什么是yaml? Python资源共享群:626017123不是标记语言 对用户极其友好 数据序列化标准 跨语言 所有编程语言都支持 跨 ...

最新文章

  1. UE4材质着色器全面学习教程
  2. 面试--java实现一个多人图文聊天室(c/s或b/s),写出思路
  3. pythreejs is needed for plotting with pythreejs backend
  4. Cocos 2d-x 3.3版本升级 五大维度提升3D品质
  5. 计算机竞赛游戏探险岛,冒险岛2五大全新团本综合分析
  6. 最新,使用truffle框架之后,安装ipfs的api包文件的命令变化
  7. Facebook轮播连结广告可展示5个图像与连结
  8. 通用测绘成果质检软件
  9. 【原创】使用blockUI制作自定义的漂亮的网页提示框(代替confirm和alert)
  10. leetcode讲解--937. Reorder Log Files
  11. pr cpu100%_【Premiere】视频剪辑必装插件,5个PR插件推荐
  12. JAVA 类和对象的实例
  13. OpenStack安装CentOS镜像:Device eth0 does not seem to be present, delaying initialization
  14. python这个怎么读-python怎么读(python怎么读中文)
  15. 目标定位算法(三)之基于角度的定位算法
  16. 逻辑回归的参数计算:牛顿法,梯度下降法,随机梯度下降法
  17. 如何使用predict()输出预测结果 以及 输出值转换为0/1值。
  18. 微信小游戏子域中请求微信头像,cocos create会自动添加前缀的问题
  19. Catia 二次开发 资料
  20. Qt数据库应用22-文件编码格式识别

热门文章

  1. 360官网上下载不同版本的浏览器
  2. 公司内部资料!游戏上线前部署准备,就这新手都行
  3. systemctl重新加载_如何使用systemctl重新启动服务
  4. mysql delimiter 无效_MySQL“DELIMITER”关键字不起作用
  5. scp command
  6. android 哪个服务提示 存储设备空间不足,请释放一些空间,手机出现空间不足,至少需要449.93MB手机存储空间怎么办...
  7. 2022年安全员-A证考试题库及在线模拟考试
  8. 计算机应用制作ppt,计算机应用基础_幻灯片制作.ppt
  9. android手机删除应用程序未安装失败,软件安装未成功,手机内存减少之解决方法(安卓)...
  10. git mr 怎样合并部分_系统掌握Git之—分离头指针与合并操作