golang 配置文件解析神器--viper


項目地址: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)
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM