在前面的章節,我們介紹了可以將參數放在環境變數內,透過os.Getenv來取得參數,不過這種方式有個小問題,因為環境變數是key-value的儲存形式,所以當你有著大量參數需要管理,或是照著各種服務分類時,管理起來就會很不直覺,必須靠參數名稱去處理。
舉例來說,這是環境變數版env
可以看到單純mysql 的 master 跟 slave就要靠key的名稱來分類,當參數一多就會很難管理。
這個時候就輪到Viper出場了。
viper是由go語言所編寫,用來管理跟使用設定檔的套件,
通常我們會將設定檔以.yaml的檔案類型來管理。
name: "linux"
mysql:
master:
host: 127.0.0.1
port: 3306
username: "root"
password: "1234"
dbname: "users"
maxIdle: 10
maxConn: 100
connMaxLifetime: 30
slave:
host: 127.0.0.1
port: 3306
username: "root"
password: "1234"
dbname: "users"
maxIdle: 10
maxConn: 100
connMaxLifetime: 30
以這種格式就可以很方便看出參數的層級與分類,舉上面範例來說,得知mysql下分類成master跟slave的參數,各自分別的參數設定就通通一目瞭然,不用在看key的名稱來分辨。
而Viper在讀取這些設定檔也非常簡單,以下圖來說:
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath("/etc/appname/")
err := viper.ReadInConfig()
viper會依照SetConfigName指定的名稱,SetConfigType指定的檔案類型跟AddConfigPath指定的路徑去搜尋設定檔,並在viper.ReadInConfig這行將設定檔讀入記憶體內,而要取出這些參數也很簡單。
name := viper.GetString("name")
address := viper.GetString("mysql.master.host")
以上圖的方法就可以取出第一層或是第n層的參數了,如果你了解go的struct的話,改使用
viper.Unmarshal(&c)
一次全部拿出來,也是一種方式。