开发者

Go语言读取YAML 配置文件的两种方式分享

目录
  • 前言
  • yaml.v3 包
    • 读取 yaml 文件
  • viper 包
    • 读取 yaml 文件
  • 小结

    前言

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

    yaml.v3 包

    yaml.v3 的包,开发者_C入门可以让我们在 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.oWmKhoEO1
      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 目录下寻找
     python   viper.AddConfigPath("./config")
        // 寻找配置文件并读取
        err := viper.ReadInConfig()
        if err != nil {
                panic(fmt.Errorf("fatal error config file: %w", err))
        }
        fmtandroid.Println(viper.Get("mysql"))     // map[port:3306 url:127.0.0.1]
        fmt.Println(viper.Get("mysql.url")) // 127.0.0.1
    }

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

    通过 SetConfigTyhttp://www.devze.compe 函数,指定配置文件的类型;

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

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

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

    小结

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

    到此这篇关于Go语言读取YAML 配置文件的两种方式分享的文章就介绍到这了,更多相关Go读取YAML 配置文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜