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 main
import (
"fmt"
"gopkg.in/yaml.v2"
)
func main() {
var t T
s := `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 int
A int //yaml中a的值会给哪一个?
b int
B 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 main
import (
"fmt"
"log"
"gopkg.in/yaml.v2"
)
type StructA struct {
A string `yaml:"a"`
}
type StructB struct {
StructA
C StructA
B 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 StructB
err := 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 StructA
B 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 main
import (
"fmt"
"os"
"gopkg.in/yaml.v2"
)
type StructA struct {
A string `yaml:"a"`
}
type StructB struct {
StructA
C StructA
B string `yaml:"b"`
}
func main() {
var b StructB
yfile, _ := 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 main
import (
"log"
"os"
"gopkg.in/yaml.v2"
)
type StructA struct {
A string `yaml:"a"`
}
type StructB struct {
StructA
C StructA
B 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 StructB
x := 22
err := 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 国际许可协议进行许可。转载请注明出处!
Golang 解析Yaml格式的更多相关文章
- golang使用yaml格式解析构建配置文件
现在主流的配置文件格式有这么几种,xml.yaml.config… xml就算了,太挫了,太土, 太繁琐… config 就是mysql,apache my.cnf的那种格式,这个格式适合功能分层, ...
- golang解析json格式 -- 全
项目中客户端和服务端的交互数据部分为json,因此在服务端就得解析,复杂的json解析起来其实还是挺费劲的. 交互的数据类似如下格式: {"sn":1,"ls" ...
- kubernetes yaml格式的Pod配置文件
kubernetes yaml文件解析 # yaml格式的pod定义文件完整内容: apiVersion: v1 #必选,版本号,例如v1 kind: Pod #必选,Pod metadata: #必 ...
- WP8解析JSON格式(使用DataContractJsonSerializer类)(推荐)
DataContractJsonSerializer是.NET自带的类,在解析JSON格式的时候使用起来方便快捷,至于生成方面由于暂时没用到就没去看了.使用需要引用System.Runtime.Ser ...
- WP8解析JSON格式(使用Newtonsoft.Json包)
DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式. 这里举一个简单的解析JSON格式的例子(更多JSON操作): { "response&q ...
- WP8解析XML格式文件
DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式,如果要返回XML格式的话,需要在加上format=xml. 这里举一个简单的解析XML格式的例子(更 ...
- NSXMLParser解析xml格式
NSXMLParser解析xml格式的数据 用法如下: 首先,NSXMLParser必须继续NSXMLParserDelegate协议 @interface XMLHelper : NSObject ...
- C语言解析Ini格式文件
引用别人的博文: http://www.open-open.com/lib/view/open1402278076447.html 可以解析 INI 格式的字符串.解析文件.保存到文件. 下面是头文件 ...
- Java使用snakeyaml解析yaml
YAML Yaml是一种"是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言."类似于XML但比XML更简洁,语法详见 http://www.ruan ...
随机推荐
- Python数据分析——numpy基础简介
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:基因学苑 NumPy(Numerical Python的简称)是高性 ...
- ISE第三方编辑器的使用
刚开始使用ISE时候感觉ISE自带的编辑器并没有什么难用的,但是在看到了小梅哥的视频教学中那样行云流水般的操作让我心动不已,由此找到了相关的编辑器.为了以后看着方便直接摘取了前人的经验在我自己的博客中 ...
- C#使用Halcon连接相机
(注意:一个相机不能两个软件同时使用在使用vs的时候把halcon关掉,用halcon的时候把vs的关掉切记*一个大坑* 在vs中调用的代码的时候要是用多线程才能显示出来图像不然则录像显示不出来) 1 ...
- Redis的各种数据类型到底能玩出什么花儿?
https://mp.weixin.qq.com/s/ZSQ9vCkWXYuLrKS0UJ4RIg 两个星期终于肝了出来,Redis相关问题脑图,终于整理完了!!! 文末无套路分享~~附获取方式 Re ...
- Django---博客项目实战
1.urls from django.conf.urls import url from django.contrib import admin from blog import views urlp ...
- JSONObject遍历
导入JSONObject和JSONArray所需要的jar包 JSONObject所必需的6个jar包: commons-beanutils-1.7.0.jar commons-collections ...
- java 控制语句、数组、方法
一.控制语句 1.if 语句 if语句是指如果满足某种条件,就进行某种处理. 流程图: 2. if…else语句 语法格式: if (判断条件){ 执行语句1 …… }else{ 执行语句2 …… } ...
- 大数据(hadoop)
大数据 一.概述 二.大数据特点 三.大数据部门组织结构 hadoop框架 一.hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 主要解决,海量数据的存储和海量数 ...
- java并发包提供的三种常用并发队列实现
java并发包中提供了三个常用的并发队列实现,分别是:ConcurrentLinkedQueue.LinkedBlockingQueue和ArrayBlockingQueue. ConcurrentL ...
- SpringBoot学习之整合Druid的简单应用
一.Druid介绍 Druid简介 Druid是目前Java语言中最好的数据库连接池之一.结合了 C3P0.DBCP 等 DB 池的优点,同时加入了日志监控.Druid 是一个分布式的.支持实时多维 ...