Golang 配置管理神器Viper

Golang 配置管理神器Viper

在專案中 有許多地方都需要配置 ,但在眾多的地方 如果沒有一個檔案能管理全部的設定 ,但人工總不可能記得這麼多,因此找了一套golang 配置管理器 。

此次用到的套件是 viper

viper 有支援多個配置分類 JSON, TOML, YAML, HCL, envfile … 等,而本文選擇使用toml ,主要是覺得很直觀 也很好配置 ,而配置範本如下 可以很直觀地看到 現在要配置哪個。

addr = "0.0.0.0:8888" 
jwttoken= "fjklbaj1t" 
model = "debug" # debug or release 
 
[Mysql] 
host = "127.0.0.1" 
port = 3306 
name = "root" 
password = 123456 
dbName = "test_db" 
 
[Redis] 
host = "127.0.0.1" 
port = 6379

而項目目錄 會像是這樣

├── main.go 
├── pkg 
│   ├── config 
│   │   └── viper.go

代碼如下

先將配置分類,每一個分類定義一個struct ,之後再透過 init 自動加載即可透過全局 config.GetConfig.* 取得配置資訊。

package config 
 
import ( 
 "github.com/spf13/viper" 
) 
 
type ServerConfig struct { 
 Addr     string      `mapstructure:"addr"` 
 JwtToken string      `mapstructure:"jwttoken"` 
 Mysql    MysqlConfig `mapstructure:"mysql"` 
 //RedisInfo   RedisConfig `mapstructure:"redis"` 
 //LogsAddress string      `mapstructure:"logsAddress"` 
} 
 
type MysqlConfig struct { 
 Host     string `mapstructure:"host"` 
 Port     int    `mapstructure:"port"` 
 Name     string `mapstructure:"name"` 
 Password string `mapstructure:"password"` 
 DbName   string `mapstructure:"dbName"` 
} 
 
type RedisConfig struct { 
 Host string `mapstructure:"host"` 
 Port int    `mapstructure:"port"` 
} 
 
var envInit *ServerConfig 
 
func init() { 
 viper.SetConfigFile("env.toml") 
 if err := viper.ReadInConfig(); err != nil { 
  panic(err) 
 } 
 
 envInit = &ServerConfig{} 
 if err := viper.Unmarshal(&envInit); err != nil { 
  panic(err) 
 } 
 
} 
 
func GetConfig() *ServerConfig { 
 return envInit 
}