«

Go语言如何读取YAML配置文件

时间:2024-4-8 09:11     作者:韩俊     分类: Go语言


今天小编给大家分享一下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

    标签: golang

    热门推荐