Go 读取 YAML 配置文件的两种方式

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 本文介绍了读取 YAML 配置文件的两种方式,第一种是通过 yaml.v3 包,第二种是通过 viper 包。如果是在项目里解析配置文件,推荐使用 viper 包,它支持解析多种格式的配置文件,监听配置文件的更新,修改配置文件等。

耐心和持久胜过激烈和狂热。

哈喽大家好,我是陈明勇,本文分享的内容是 Go 读取 YAML 配置文件的两种方式。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

前言

在日常开发中,YAML 格式的文件基本上被默认为是配置文件,其内容因为缩进带来的层级感看起来非常直观和整洁。本文将会对 YAML 内容的读取进行介绍。

yaml.v3 包

yaml.v3 的包,可以让我们在 Go 里面轻松地操作 yaml 格式的数据(如将 yaml 格式转成结构体等)。在使用 yaml.v3 包之前,我们需要先安装它:

go get gopkg.in/yaml.v3
复制代码

读取 yaml 文件

yaml 测试文件内容:

mysql:
  url: 127.0.0.1
  port: 3306
redis:
  host: 127.0.0.1
  port: 6379
复制代码

yaml 文件的数据转成自定义的结构体或 Map

import (
  "fmt"
  "gopkg.in/yaml.v3"
  "os"
)
type Config struct {
  Mysql Mysql `json:"mysql"`
  Redis Redis `json:"redis"`
}
type Mysql struct {
  Url  string
  Port int
}
type Redis struct {
  Host string
  Port int
}
func main() {
  dataBytes, err := os.ReadFile("test.yaml")
  if err != nil {
    fmt.Println("读取文件失败:", err)
    return
  }
  fmt.Println("yaml 文件的内容: \n", string(dataBytes))
  config := Config{}
  err = yaml.Unmarshal(dataBytes, &config)
  if err != nil {
    fmt.Println("解析 yaml 文件失败:", err)
    return
  }
  fmt.Printf("config → %+v\n", config) // config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
  mp := make(map[string]any, 2)
  err = yaml.Unmarshal(dataBytes, mp)
  if err != nil {
    fmt.Println("解析 yaml 文件失败:", err)
    return
  }
  fmt.Printf("map → %+v", config) // config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
}
复制代码

执行结果:

yaml 文件的内容:
 mysql:
  url: 127.0.0.1
  port: 3306
redis:
  host: 127.0.0.1
  port: 6379
config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
map → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
复制代码
  • 首先通过 os 包里的 ReadFile 函数读取文件的内容,获取 []byte 类型的数据;
  • 通过 yaml 包的 Unmarshal(in []byte, out interface{}) 函数将字节数组类型的数据解析到 Config 结构体变量里,Unmarshal 函数需要传递两个参数,第一个是 字节数组类型的数据,第二个是一个任意类型的数据,实际上要传入一个指针变量,或者某个变量的地址值;
  • 通过打印结果可以看到 yaml 文件的内容已经成功解析到结构体 configmp 变量里了,后续可以通过操作结构体和 map 获取对应数据。

viper 包

viper 包可以帮助我们做很多东西,比如读取 jsonyamlproperties 等配置文件,读取环境变量、读取命令行参数等。在使用 viper 包之前,我们需要先安装它:

go get github.com/spf13/viper
复制代码

读取 yaml 文件

yaml 测试文件内容:

mysql:
  url: 127.0.0.1
  port: 3306
redis:
  host: 127.0.0.1
  port: 6379
复制代码

代码示例:

import (
    "fmt"
    "github.com/spf13/viper"
)
func main() {
    // 设置配置文件的名字
    viper.SetConfigName("test")
    // 设置配置文件的类型
    viper.SetConfigType("yaml")
    // 添加配置文件的路径,指定 config 目录下寻找
    viper.AddConfigPath("./config")
    // 寻找配置文件并读取
    err := viper.ReadInConfig()
    if err != nil {
            panic(fmt.Errorf("fatal error config file: %w", err))
    }
    fmt.Println(viper.Get("mysql"))     // map[port:3306 url:127.0.0.1]
    fmt.Println(viper.Get("mysql.url")) // 127.0.0.1
}
复制代码

通过 SetConfigName 函数,指定配置文件的名称;

通过 SetConfigType 函数,指定配置文件的类型;

通过 AddConfigPath 函数,指定配置文件所在目录,可以多次调用此函数,指定多个目录;

通过 ReadInConfig 函数,寻找配置文件并读取,操作的过程中可能会发生错误,如配置文件没找到,配置文件的内容格式不正确等;

读取文件成功之后,可以通过 Get 函数,通过指定 key 获取对应的 value

小结

本文介绍了读取 YAML 配置文件的两种方式,第一种是通过 yaml.v3 包,第二种是通过 viper 包。如果是在项目里解析配置文件,推荐使用 viper 包,它支持解析多种格式的配置文件,监听配置文件的更新,修改配置文件等。

目录
相关文章
|
9月前
|
XML JSON Java
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
160 0
SpringBoot入门(三) 之springboot的配置配置文件以及yaml的使用
|
3月前
|
Shell Go
go 编辑yaml 文件
在Go语言中编辑YAML文件通常涉及以下步骤: 1. 读取YAML文件内容到字符串。 2. 使用YAML解析库(如`gopkg.in/yaml.v2`)将字符串解析为Go数据结构(如`map[string]interface{}`或自定义的结构体)。 3. 修改数据结构中的值以更新YAML内容。 4. 将修改后的数据结构编码回YAML格式的字符串。 5. 将字符串写回到YAML文件。 以下是一个简单的例子,展示了如何使用`gopkg.in/yaml.v2`库来编辑YAML文件: 首先,确保你已经安装了`gopkg.in/yaml.v2`包: ```bash go get gopkg.i
|
3月前
|
JSON Java Go
Go语言读取多种格式配置文件
Go语言读取多种格式配置文件
25 0
|
3月前
|
存储 JSON JavaScript
【YAML语法规范指南】从入门到精通,揭秘神秘语法,引领配置文件解析指南(基础结构篇)
"YAML Ain't Markup Language"(简称YAML)是一种专为人类设计的数据序列化语言,适用于多种现代编程语言,可广泛应用于各类日常任务。它是一种以人类可读形式呈现的、适用于多种语言的Unicode数据序列化标准。它基于敏捷编程中常见的本地数据结构,广泛应用于配置文件、互联网消息传递、对象持久化以及数据审计等多个领域。遵循Unicode标准、
142 8
【YAML语法规范指南】从入门到精通,揭秘神秘语法,引领配置文件解析指南(基础结构篇)
|
9月前
|
前端开发 Java 数据库
SpringBoot解析指定Yaml配置文件
最近在看某个开源项目代码并准备参与其中,代码过了一遍后发现多个自定义的配置文件用来装载业务配置代替数据库查询,直接响应给前端,这里简单记录一下实现过程。
275 0
Viper中的yaml配置文件入门,Viper开发环境和生产环境的隔离
Viper中的yaml配置文件入门,Viper开发环境和生产环境的隔离
|
5月前
|
监控 测试技术 Go
【测试平台系列】第一章 手撸压力机(六)- 日志服务及使用yaml配置文件
上一章节我们封装TO(测试对象),方便我们以后扩展其他被测的接口或协议。本章我们主要实现以下,我们的日志输出。
|
7月前
|
存储 JSON Go
Go语言微服务框架 - 2.实现加载静态配置文件
今天,我们先将重点放到加载配置文件库的技术选型,顺便分享一些常见的问题。
42 1
|
8月前
|
JSON Java Shell
Go几种读取配置文件的方式
Go几种读取配置文件的方式
46 0
|
9月前
|
关系型数据库 MySQL 数据处理
Python--Yaml配置文件
Python--Yaml配置文件
69 0

热门文章

最新文章