今天小编给大家分享一下Go语言如何读取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 文件的内容: 
", string(dataBytes))
    config := Config{}
    err = yaml.Unmarshal(dataBytes, &config)
    if err != nil {
        fmt.Println("解析 yaml 文件失败:", err)
        return
    }
    fmt.Printf("config → %+v
", 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包之前,我们需要先安装它:
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。