前言
在日常开发中,YAML 格式的文件基本上被默认为是配置文件,其内容因为缩进带来的层级感看起来非常直观和整洁。本文将会对 YAML
内容的读取进行介绍。
yaml.v3 包
yaml.v3
的包,可以让我们在 Go
里面轻松地操作 yaml
格式的数据(如将 yaml
格式转成结构体等)。在使用 yaml.v3
包之前,我们需要先安装它:
1
|
go get gopkg.in/yaml.v3 |
读取 yaml 文件
yaml 测试文件内容:
1
2
3
4
5
6
7
|
mysql: url: 127.0.0.1 port: 3306 redis: host: 127.0.0.1 port: 6379 |
将 yaml
文件的数据转成自定义的结构体或 Map
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
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 文件的内容已经成功解析到结构体
config
和mp
变量里了,后续可以通过操作结构体和map
获取对应数据。
viper 包
viper
包可以帮助我们做很多东西,比如读取 json
、yaml
、properties
等配置文件,读取环境变量、读取命令行参数等。在使用 viper
包之前,我们需要先安装它:
1
|
go get github.com/spf13/viper |
读取 yaml 文件
yaml 测试文件内容:
1
2
3
4
5
6
7
|
mysql: url: 127.0.0.1 port: 3306 redis: host: 127.0.0.1 port: 6379 |
代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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
包,它支持解析多种格式的配置文件,监听配置文件的更新,修改配置文件等。
到此这篇关于Go语言读取YAML 配置文件的两种方式分享的文章就介绍到这了,更多相关Go读取YAML 配置文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7178146763927683127