Golang庫 - viper讀取配置文件

/ 前言 /

viper是由Steve Francia編寫的開源配置解決方案, 也是cobra的作者, 我們來看下viper的功能

  • 支持JSON、TOML、YAML/YML、PROPERTIES、ENVFILE等文件的讀取
  • 修改讀取文件的鍵值數據
  • 監聽配置文件的修改並自動重新加載

下載

go get github.com/spf13/viper

GitHub地址

/ 1 / 讀取配置文件

在讀取配置文件中我們將會演示viper的集中使用方式

我們以.yml文件爲例

config.yml
user:
  name: "wise"
  age: 18
config.go
package config

import (
	"fmt"
	"github.com/spf13/viper"
)


// 這裏的配置文件讀取可以使用相對路徑, 我這裏因爲是同級所以直接使用config.yml即可
//var filePath = "../test/config.yml"
var filePath = "config.yml"

var cfg = Config{}

// 這裏有倆種寫法, 如果你要讀取的配置文件比較大而且類型較多那麼建議你使用第二種
// 第一種
type Config struct {
	UserInfo struct{
		Name string `mapstructure:"name"`
		Age string   `mapstructure:"age"`
	} `mapstructure:"user"`
}

// 第二種
type Config struct {
	 User UserInfo `mapstructure:"user"`
}
UserInfo struct{
	Name string  `mapstructure:"name"`
	Age  int     `mapstructure:"age"`
}

func LoadConfig() {
	// 設置配置文件信息
	viper.SetConfigType("yml")
	viper.SetConfigFile(filePath)

	// 讀取配置文件
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println("讀取配置文件失敗, 異常信息 : ", err)
	}

	// 直接從viper對象中獲取key的value數據,並且可以定義類型
	fmt.Println(viper.Get("user.name"))
	fmt.Println(viper.GetInt("user.age"))
	
	// 判斷key是否存在, 返回true/false
	fmt.Println(viper.IsSet("user.name"))
	
	// 設置key的value值, 優先級最高, 可以在讀取配置文件之前設置
	viper.Set("user.age",19)
	

	// 將文件內容解析後封裝到cfg對象中
	err = viper.Unmarshal(&cfg)
	if err != nil {
		fmt.Println("解析配置文件失敗, 異常信息 : ", err)
	}
}

// 使用時直接調用該方法即可
func GetInfo() Config {
	return cfg
}

測試代碼

config_test.go
import (
	"fmt"
	"testing"
)

func TestGetInfo(t *testing.T) {
	LoadConfig()
	fmt.Println("name : ",GetInfo().UserInfo.Name)
	fmt.Println("age : ",GetInfo().UserInfo.Age)
}

輸出信息

name : wise
age : 18

我們總結一下在上面我們使用到的viper的功能

  • 可以在直接從viper對象中獲取數據
  • 直接從viper對象中獲取數據時可以指定返回類型
  • 可以在讀取配置文件之前修改value的值, 且優先級最高

/ 2 / 自動更新配置文件

我們來看一下viper是否可以自動更新配置文件

package main

import (
	"fmt"
	"github.com/spf13/viper"
	"time"
)

func main() {
	viper.SetConfigType("yml")
	viper.SetConfigFile("./test/config.yml")

	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println("read config is failed err:", err)
	}

	viper.WatchConfig()

	fmt.Println("age : ", viper.GetInt("user.age"))
	// 我們讓線程睡眠20s, 在此期間我們去修改config.yml文件中age的值
	time.Sleep(time.Second * 20)
	fmt.Println("age : ", viper.GetInt("user.age"))
}

輸出信息

age : 18
age : 180

倆次打印結果一樣的朋友可以將睡眠時間調整的再長一點試一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章