Viper解析&載入配置

流雨聲發表於2020-07-13

Viper解析&載入配置

1    Viper是什麼

Viper是一個方便Go語言應用程式處理配置資訊的庫。它可以處理多種格式的配置。它支援的特性:

  • 設定預設值
  • 從JSON、TOML、YAML、HCL和Java properties檔案中讀取配置資料
  • 可以監視配置檔案的變動、重新讀取配置檔案
  • 從環境變數中讀取配置資料
  • 從遠端配置系統中讀取資料,並監視它們(比如etcd、Consul)
  • 從命令引數中讀物配置
  • 從buffer中讀取
  • 呼叫函式設定配置資訊

2    安裝viper

go get github.com/spf13/viper

在go的根目錄下 新建 web/config目錄 ,目錄參考: /usr/local/go/web/config


file

3    Viper在Go專案中如何使用

在 config目錄中,新建 config.yaml (配置)檔案,內容如下:
common:
  database:
    name: test
    host: 127.0.0.1

3.1    在config目錄中,新建 config.go (獲取配置)檔案,內容如下

package config
 
import (
    "fmt"
    "github.com/spf13/viper"
)
 
func Init() (interface{},error) {  //模組中供其他包呼叫的方法,首字母必須大寫
    //viper設定 配置
    viper.Set("name","abc")
    fmt.Printf("name的值是%v\n",viper.GetString("name") )
 
    //讀取配置檔案配置
    viper.AddConfigPath("config")
    viper.SetConfigName("config")
    error := viper.ReadInConfig()
    /*
    程式碼解析:
        viper.AddConfigPath("conf")用來指定yaml配置檔案的路徑
        viper.SetConfigName("config")用來指定配置檔案的名稱
        viper.ReadInConfig()是解析配置檔案的函式,如果配置檔案的路徑錯誤獲名稱錯誤則解析失敗,會報錯誤
        viper.GetString("database.name")是用來從配置檔案中根據層級關係來獲取資料
        最後,通過fmt.Println()對資料結果進行輸出
    */
    if(error != nil){
        panic(error)
    }
    c := viper.AllSettings() //獲取所有配置
    return c,nil
}
 
//獲取資料庫配置資訊
func GetDatabaseInfo() map[string]interface{} {  //模組中供其他包呼叫的方法,首字母必須大寫
    return viper.GetStringMap("common.database")
}
 
//獲取環境變數
func GetEnvInfo(env string) string {
    viper.AutomaticEnv()
    return viper.GetString(env)
}

3.2    web目錄中,新建 testviper.go (載入配置)檔案,內容如下:

package main
 
import (
    "fmt"
    "web/config"
)
 
func main() {
    vipConfig,error := config.Init()                                  //vipConfig是配置
    fmt.Printf("config.init error是%v\n", error)
    //fmt.Printf("config.init vipConfig是%v\n",vipConfig,)
    database := config.GetDatabaseInfo()
    fmt.Printf("直接獲取common[database]配置是%v\n", database)
    fmt.Printf("直接獲取common[database][host]配置是%v\n", database["host"])
 
    //因為我們不知道 vipConfig 的下級是什麼型別的資料,所以這裡使用了interface{}
    //因此所有的型別、任意動態的內容都可以解析成 interface{}。
    for key,val := range vipConfig.(map[string]interface{}){        //迴圈介面型別,獲取配置資訊
        fmt.Printf("vipConfig 的key是%v val是%v\n",key,val )
 
        switch val.(type) {                                          //判斷val的型別
        case map[string]interface{}:                                //如果是 interface介面型別
            for ke,va := range val.(map[string]interface{}){        //迴圈介面型別,獲取配置資訊
                fmt.Printf("vipConfig 的ke是%v va是%v\n",ke,va )
 
                switch va.(type) {                                    //判斷va的型別
                case map[string]interface{}:                         //如果是 interface介面型別
                    for k,v := range va.(map[string]interface{}){   //迴圈介面型別,獲取配置資訊
                        fmt.Printf("vipConfig 的k是%v v是%v\n",k,v )
                    }
                }
            }
        }
    }
 
    //viper可以獲取伺服器的環境變數
    GO111MODULE := config.GetEnvInfo("GO111MODULE")
    fmt.Printf("GO111MODULE的值是%v\n",GO111MODULE)
 
}

3.3    使用 go run testviper.go 執行該檔案即可

[root@localhost web]# go run testviper.go
name的值是abc
config.init error是<nil>
直接獲取common[database]配置是map[host:[127.0.0.1] name:[test]]
直接獲取common[database][host]配置是[127.0.0.1]
vipConfig 的key是common val是map[database:map[host:127.0.0.1 name:test]]
vipConfig 的ke是database va是map[host:127.0.0.1 name:test]
vipConfig 的k是name v是test
vipConfig 的k是host v是127.0.0.1
vipConfig 的key是name val是abc
GOROOT的值是on

4    總結

viper支援的載入配置檔案型別很多,我們從配置檔案讀取或者獲取相關需要的資料資訊,根據檔案字尾名查詢分割相關的配置檔案型別指定操作配置的字尾名指定。

本文由部落格作者流雨聲
github地址:https://github.com/vpc123

相關文章