一個強大簡單好用的配置解決方案,Viper
Viper具有以下特性:
- 設定預設值
- 可以讀取如下格式的配置檔案:JSON、TOML、YAML、HCL
- 監控配置檔案改動,並熱載入配置檔案
- 從環境變數讀取配置
- 從遠端配置中心讀取配置(etcd/consul),並監控變動
- 從命令列 flag 讀取配置
- 從快取中讀取配置
- 支援直接設定配置項的值
Viper的讀取順序:
viper.Set()
所設定的值- 命令列 flag
- 環境變數
- 配置檔案
- 配置中心:etcd/consul
- 預設值
Viper在初始化之後,只需要呼叫viper.GetString()
、viper.GetInt()
和 viper.GetBool()
等函式即可得到配置檔案中對應的引數。
Viper 也可以非常方便地讀取多個層級的配置,比如這樣一個 YAML 格式的配置:
common:
db:
name: db
addr: 127.0.0.1:3306
username: root
password: root
複製程式碼
如果要讀取name,只需要執行viper.GetString("common.db.name")
就可以
下面來一個簡單的例子介紹Viper:
config/config.go
package config
import (
"strings"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
type Config struct {
Name string
}
func Init(cfg string) error {
c := Config{
Name: cfg,
}
// 初始化配置檔案
if err := c.initConfig(); err != nil {
return err
}
c.watchConfig()
return nil
}
func (c *Config) initConfig() error {
if c.Name != "" {
// 如果指定了配置檔案,則解析指定的配置檔案
viper.SetConfigFile(c.Name)
} else {
// 如果沒有指定配置檔案,則解析預設的配置檔案
viper.AddConfigPath("conf")
viper.SetConfigName("config")
}
// 設定配置檔案格式為YAML
viper.SetConfigType("yaml")
// viper解析配置檔案
if err := viper.ReadInConfig(); err != nil {
return err
}
return nil
}
// 監聽配置檔案是否改變,用於熱更新
func (c *Config) watchConfig() {
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Printf("Config file changed: %s\n", e.Name)
})
}
複製程式碼
conf/config.yaml
name: demo
common:
db:
name: db
addr: 127.0.0.1:3306
username: root
password: root
複製程式碼
main.go
package main
import (
"test/config"
"fmt"
"github.com/spf13/viper"
)
func main() {
if err := config.Init(""); err != nil {
panic(err)
}
name := viper.GetString("name")
fmt.Println("Viper get name:",name)
}
複製程式碼
執行go run main.go
輸出Viper get name: demo
微信搜尋「goentry-xyz」,關注公眾號「燈下獨碼」