項目地址:https://github.com/spf13/viper
安裝方式:go get github.com/spf13/viper
簡介
viper是一個十分強大的配置文件解析工具,具有以下特點
- 設置默認值
- 支持的文件包括JSON, TOML, YAML, HCL, envfile 和 Java properties 配置文件
- 實時監聽和重新讀取配置文件
- 從環境變量中讀取
- 從遠程配置系統(etcd或Consul)中讀取,並監聽更改
- 從命令行讀取
- 從緩沖讀取
- 設置顯示值
另外需要注意的是,viper對配置中的key
是大小寫不敏感的
下面我以YAML格式的配置文件為例,介紹viper的用法,其他跟多的用法請見官網
示例配置文件
一個好的項目應該把配置文件分成兩份,一份存放不敏感信息(比如項目運行端口),一份存放敏感信息(比如數據庫密碼),下面兩個配置文件用作舉例
public config config/config/config.yaml
TimeStamp: "2018-07-16 10:23:19"
Username: "horika"
BasicInfo:
RealName: "Harry"
Age: "18"
Language:
- "Golang"
- "Python"
- "C++"
Married: false
Hobby:
Sport:
- "Lure"
- "pingpong"
Music:
- "Bohemian Rhapsody"
LuckyNumber: 22
secret config config/secret/secret.yaml
redis:
admin:
addr: "127.0.0.1:6379"
password: ""
db: 0
mysql:
driver: "mysql"
uri:
"root:123456@tcp(localhost:3306)/user?charset=utf8&parseTime=True&loc=Local&multiStatements=true"
jwt:
secret: "horika@^-^@kainhuck"
告訴viper你要解析的配置文件是什么
示例代碼
var config *viper.Viper
// Init 初始化配置文件解析
func Init(){
config = viper.New()
// 設置 public 配置文件名
config.SetConfigName("config")
// 設置 public 配置文件類型
config.SetConfigType("yaml")
// 設置配置文件存放的目錄
config.AddConfigPath("./config/config")
// 讀取該配置文件
config.ReadInConfig()
// 解析 secret config
config.SetConfigName("secret")
config.SetConfigType("yaml")
config.AddConfigPath("./config/secret")
config.MergeInConfig()
}
說明
- SetConfigName 指定配置文件名,不需要加后綴
- SetConfigType 指定配置文件類型,可以省略,viper會自動識別
- AddConfigPath 添加配置文件所在目錄,可以多個,告訴viper區哪里尋找配置文件
- ReadInConfig 從前面告知的配置中加載配置文件
- MergeInConfig 從前面告知的配置中加載配置文件並合並到之前
上面演示的只是一種讀取方式,viper還有其他的讀取方式
var config *viper.Viper
// Init 初始化配置文件解析
func Init(){
config = viper.New()
// 設置 public 配置文件名
config.SetConfigFile("./config/config/config.yaml")
// 讀取該配置文件
config.ReadInConfig()
// 解析 secret config
config.SetConfigFile("./config/secret/secret.yaml")
config.MergeInConfig()
}
說明
- SetConfigFile 指定配置文件的全路徑
從IO流中讀取配置文件
var config *viper.Viper
// Init 初始化配置文件解析
func Init() {
config = viper.New()
f, _ := os.Open("./config/config/config.yaml")
defer f.Close()
config.SetConfigType("yaml")
config.ReadConfig(f)
s, _ := os.Open("./config/secret/secret.yaml")
defer s.Close()
config.SetConfigType("yaml")
config.MergeConfig(s)
}
說明
- ReadConfig 讀取io流,注意和ReadInConfig區分
- SetConfigType 從流中讀取需要指定文件類型
讀取配置文件
viper讀取配置文件就是各種Get
- Get 自動判斷類型
- GetTime 獲取時間類型
- GetString 獲取字符串類型
- GetBool 獲取bool類型
- GetInt 獲取int類型
- GetStringMap 獲取map類型
- ...
示例
fmt.Println(config.Get("username"))
fmt.Println(config.Get("mysql"))
fmt.Println(config.GetTime("timestamp"))
序列化
viper作為一個優秀的配置文件解析工具,他支持將配置信息序列化為結構體對象
package main
import (
"fmt"
"github.com/spf13/viper"
)
var config *viper.Viper
var AllConfig TotalConfig
// Init 初始化配置文件解析
func Init() {
config = viper.New()
config.SetConfigFile("./config/config/config.yaml")
config.ReadInConfig()
config.SetConfigFile("./config/secret/secret.yaml")
config.MergeInConfig()
config.Unmarshal(&AllConfig)
}
type basicinfo struct {
RealName string
Age int
Language []string
Married bool
}
type hobby struct {
Sport []string
Music []string
LuckyNumber int
}
type admin struct {
Addr string
paswsword string
db int
}
type redis struct {
Admin admin
}
type mysql struct {
Driver string
Uri string
}
type jwt struct {
Secret string
}
type TotalConfig struct {
TimeStamp string
Username string
BasicInfo basicinfo
Hobby hobby
Redis redis
Mysql mysql
Jwt jwt
}
func main() {
Init()
fmt.Println(AllConfig.BasicInfo.Married)
fmt.Println(AllConfig.Jwt.Secret)
}