/ 前言 /
viper是由Steve Francia編寫的開源配置解決方案, 也是cobra的作者, 我們來看下viper的功能
- 支持JSON、TOML、YAML/YML、PROPERTIES、ENVFILE等文件的讀取
- 修改讀取文件的鍵值數據
- 監聽配置文件的修改並自動重新加載
下載
go get github.com/spf13/viper
/ 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
倆次打印結果一樣的朋友可以將睡眠時間調整的再長一點試一下