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 DecoderDecoder从输入流中读取和解析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格式的更多相关文章

  1. golang使用yaml格式解析构建配置文件

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

  2. golang解析json格式 -- 全

    项目中客户端和服务端的交互数据部分为json,因此在服务端就得解析,复杂的json解析起来其实还是挺费劲的. 交互的数据类似如下格式: {"sn":1,"ls" ...

  3. kubernetes yaml格式的Pod配置文件

    kubernetes yaml文件解析 # yaml格式的pod定义文件完整内容: apiVersion: v1 #必选,版本号,例如v1 kind: Pod #必选,Pod metadata: #必 ...

  4. WP8解析JSON格式(使用DataContractJsonSerializer类)(推荐)

    DataContractJsonSerializer是.NET自带的类,在解析JSON格式的时候使用起来方便快捷,至于生成方面由于暂时没用到就没去看了.使用需要引用System.Runtime.Ser ...

  5. WP8解析JSON格式(使用Newtonsoft.Json包)

    DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式. 这里举一个简单的解析JSON格式的例子(更多JSON操作): { "response&q ...

  6. WP8解析XML格式文件

    DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式,如果要返回XML格式的话,需要在加上format=xml. 这里举一个简单的解析XML格式的例子(更 ...

  7. NSXMLParser解析xml格式

    NSXMLParser解析xml格式的数据 用法如下: 首先,NSXMLParser必须继续NSXMLParserDelegate协议 @interface XMLHelper : NSObject ...

  8. C语言解析Ini格式文件

    引用别人的博文: http://www.open-open.com/lib/view/open1402278076447.html 可以解析 INI 格式的字符串.解析文件.保存到文件. 下面是头文件 ...

  9. Java使用snakeyaml解析yaml

    YAML Yaml是一种"是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言."类似于XML但比XML更简洁,语法详见 http://www.ruan ...

随机推荐

  1. js中实现继承的方法

    目录 借用构造函数 组合继承 原型式继承 寄生式继承 寄生组合式继承 借用构造函数 这种技术的基本思想很简单,就是在子类型构造函数的内部调用超类型的构造函数.另外,函数只不过是在特定环境中执行代码的对 ...

  2. 服务注册与发现【Eureka】- Eureka简介

    什么是服务治理 SpringCloud 封装了 Netflix 公司开发的 Eureka 模块来 实现服务治理. 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所 ...

  3. 由一个计数器出发:关于vue使用独立js文件的问题

    最近有个vue项目要用ztree. 然后,我想把一些逻辑提出来作为公共的方法,放到独立的js文件里. ztreeTool.js import $ from 'jquery' export defaul ...

  4. 【揭秘】阿里测试框架,各大CTO良心力荐

    自动化测试因其节约成本.提高效率.减少手动干预等优势已经日渐成为测试人员的“潮流”,从业人员日益清楚地明白实现自动化框架是软件自动化项目成功的关键因素之一.本篇文章将从 什么是真正的自动化测试框架.自 ...

  5. Windows下安装Python 3.X 版本

    一. Python下载 Python官方下载地址 演示下载的版本为Python 3.8.3 ,你可以根据自己的选择安装其他版本的Python 二. Python 安装 下载完安装包双击安装时出错(Wi ...

  6. Java应用服务器之tomcat会话复制集群配置

    会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来:常用的会话保持有绑定会话,就是前边我们聊的在代理上通过算法或 ...

  7. iOS倒计时button闪烁

    v _button.titleLabel.text = [NSString stringWithFormat:@"%d后重发",t]; [_button setTitle:[NSS ...

  8. Head First HTML与CSS(第2版)PDF高清完整版免费下载|百度云盘

    百度云盘:Head First HTML与CSS(第2版)PDF高清完整版免费下载 提取码:i8q4 内容简介 是不是已经厌倦了那些深奥的HTML书?你可能在抱怨,只有成为专家之后才能读懂那些书.那么 ...

  9. Django序列化组件Serializers详解

    本文主要系统性的讲解django rest framwork 序列化组件的使用,基本看完可以解决工作中序列化90%的问题,写作参考官方文档https://www.django-rest-framewo ...

  10. 枚举-称硬币POJ1013

    #include <iostream> #include<string.h> using namespace std; char Lleft[][]; char Lright[ ...