在咱們開發過程當中,像數據庫信息、郵件配置和其餘的第三方服務密鑰等這些固定的信息都會寫在配置文件中,而配置文件又有多種表現形式和格式,有 JSON, TOML, YAML各類格式,並且測試環境,開發環境和生產環境用的配置文件也不是同一份,那就讓咱們說說Go 中用於加載配置信息的Viper。git
Viper是Go應用程序的完整配置解決方案,包括12-Factor應用程序。它旨在在應用程序中工做,並能夠處理全部類型的配置需求和格式。它支持:github
Viper能夠被認爲是全部應用程序配置需求的註冊表。數據庫
在構建現代應用程序時,您沒必要擔憂配置文件格式; 你能夠專一於構建出色的軟件。 Viper 能夠作以下工做:json
Viper讀取配置信息的優先級順序,從高到低,以下:bash
使用 go get -u github.com/spf13/viper 進行安裝ide
const (
// gRPC 服務地址
Address = "0.0.0.0:9090"
)
......
複製代碼
像上面這種地址寫死在代碼裏,咱們能夠把它放入配置文件中進行讀取,安裝完viper後,利用viper寫toml格式的文件函數
func init(){
viper.SetConfigFile("hello.toml")//文件名
viper.Set("Address","0.0.0.0:9090")//統一把Key處理成小寫 Address->address
err := viper.WriteConfig()//寫入文件
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
}
複製代碼
運行一下,會發現當前目錄會出現一個hello.toml的文件✅測試
相對於寫入配置文件的操做,讀取配置文件在代碼中反而會常見得多spa
viper.SetConfigFile("hello.toml")
err := viper.ReadInConfig() // 會查找和讀取配置文件
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
Address = viper.GetString("Address")
//key取Address或者address都能取到值,反正viper轉成小寫處理
fmt.Println(Address)
複製代碼
viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
複製代碼
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置發生變動:", e.Name)
})
複製代碼
啓用該功能,須要導入 viper/remot 包:命令行
import _ "github.com/spf13/viper/remote"
viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hello.json")
viper.SetConfigType("json") // 由於不知道格式,因此須要指定
err := viper.ReadRemoteConfig()
複製代碼
如下是所有代碼截圖
viper代碼短小精悍,就三個文件,很是適合初學者閱讀,若是有須要,之後會出源碼閱讀篇。