Golang解析yaml文件操作指南

目录
  • 前言
  • Simple Demo
  • go-yaml 其他解析方法
  • 总结

前言

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 中展现的 MarshallUnmarshall 方法,他们会直接在结构体和字节流上进行操作。但有时我们为了图方便想把读取字节流这一步也交给组件去执行,这时候我们可以利用 yaml.Encoderyaml.Decoder

yaml.Encoderyaml.Decoderio.Writerio.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

总结

到此这篇关于Golang解析yaml文件操作的文章就介绍到这了,更多相关Golang解析yaml文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang解析yaml文件操作

    首先安装解析的第三方包: go get gopkg.in/yaml.v2 示例: package main import ( "os" "log" "fmt" "encoding/json" "gopkg.in/yaml.v2" ) type Config struct { Test Test `yaml:"test"` } type Test struct { User []strin

  • Golang解析yaml文件操作指南

    目录 前言 Simple Demo go-yaml 其他解析方法 总结 前言 yaml 文件是研发人员最常用的配置文件,yaml 文件的树形结构一直很受大家的欢迎.有过 SpringBoot 开发经验的同学对 yaml 非常熟悉,SpringBoot 整个项目的运行就需要一个 application.yaml 文件的支持,那么 Golang 项目中的 yaml 文件是如何解析的呢?Let`s dive in! PS:根据 godocs 的说法,Golang 有三个强大的工具包支持 yaml 文件

  • c++ 解析yaml文件的步骤

    作者:李鹏 出处:http://www.cnblogs.com/li-peng/ 一直用c++操作ini做配置文件,想换成yaml,在全球最大的同性交友网站github上搜索,看有没有开源的库,功夫不负有心人,找到了yaml-cpp,用他解析了一个yaml的例子非常好使,分享一下如何使用他. 先git clone git@github.com:jbeder/yaml-cpp.git下来编译成静态库 mkdir build cd build cmake .. make 运行完后,会得到libyam

  • 云原生系列Kubernetes深度解析YAML文件使用

    目录 写在前面 YAML基础 Maps Lists 使⽤ YAML 创建 Pod 创建 Pod 创建 Deployment 写在前面 在前⾯的课程中,我们在安装 kubernetes 集群的时候使⽤了⼀些 YAML ⽂件来创建相关的资源,但大家对 YAML ⽂件还是⾮常陌⽣.所以我们先来简单看⼀看 YAML ⽂件是如何⼯作的,并使⽤ YAML ⽂件来定义⼀个 k8s pod,然后再定义⼀个 k8s deployment吧. YAML基础 它的基本语法规则如下: ⼤⼩写敏感 使⽤缩进表示层级关系

  • python解析yaml文件过程详解

    YAML语法规则: http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/ 下载PyYAML: http://www.yaml.org/ 解压安装: python setup.py install 1.新建test.yaml文件,内容如下: name: Tom Smith age: 37 spouse: name: Jane Smith age: 25 children: - name: Jimmy Smith age: 15 - nam

  • Python配置文件管理之ini和yaml文件读取的实现

    目录 1. 引言 2. 如何选择配置文件的格式 3. INI文件示例 4. YAML文件示例 5. 使用Cofigureparser读取ini文件 6. yaml文件读取示例 7. 总结 1. 引言 当我们设计软件时,我们通常会花费大量精力来编写高质量的代码.但这往往还不够,一个好的软件还应该考虑其整个系统,如测试.部署.网络等.其中最重要的一个方面是配置管理. 良好的配置管理应允许在任何环境中执行软件而不更改代码.最常见的配置包括数据库认证配置.部署服务器的主机名.动态参数等.在本文中,我想与

  • golang如何通过viper读取config.yaml文件

    目录 1.导入依赖包 2.编写yaml文件 3.编写读取yaml文件的go文件 4.使用config对象 5.viper源码分析 1.导入依赖包 import (     "github.com/spf13/viper" ) 2.编写yaml文件 放在conf目录下,文件名叫config.yaml # TODO  本地调试时放开 KubeSphere_URL: http://192.168.103.48:3188 # TODO 部署到环境时放开 #KubeSphere_URL: htt

  • Python基于yaml文件配置logging日志过程解析

    一.使用logging.config.dictConfig()函数读取配置信息,参数是字典类型 with open(file="./loggingconfigyaml.yaml", mode='r', encoding="utf-8")as file: logging_yaml = yaml.load(stream=file, Loader=yaml.FullLoader) # print(logging_yaml) # 配置logging日志:主要从文件中读取ha

  • golang解析xml的方法

    本文实例讲述了golang解析xml的方法.分享给大家供大家参考,具体如下: golang解析xml真是好用,特别是struct属性的tag让程序简单了许多,其他变成语言需要特殊类型的在golang里直接使用tag舒服 xml文件点击此处本站下载. 完整示例代码: 复制代码 代码如下: package main import (     "os"     "encoding/xml"     // "encoding/json"     &quo

  • golang解析html网页的方法

    1.先看一下整个结构: 主要是web和html目录,分别存放go代码和html相关的资源文件. 2.html代码比较简单,代码如下: <html> <head> <title>Go web</title> </head> <body> <img src="/html/pics/girl.jpg" width="500" height="500"> <form

随机推荐