欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang下的viper包的簡單使用方式

 更新時間:2023年06月12日 09:56:22   作者:imthefaker  
這篇文章主要介紹了golang下的viper包的簡單使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

golang下viper包的簡單使用

Viper 是一個完整的 Go 應(yīng)用程序配置解決方案,它旨在在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式

使用viper并不復雜,在不生成實例的情況下,viper使用默認的實例才緩存配置信息,如果你不想這么做,可以使用viper.New()方法來生成自己的實例,直接上代碼

package main
import (
	"bytes"
	"fmt"
	"github.com/spf13/viper"
)
func main() {
	viper.SetDefault("ContentDir", "content")
	viper.SetDefault("LayoutDir", "layouts")
	viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
	/**
		viper.SetDefault會設(shè)置默認參數(shù),也就是說,每次讀取文件后,這些參數(shù)都會讀取到viper的緩存中,
        并且在使用viper提供的方法寫文件時,也會一同寫進去,當使用Set方法后,默認值將會被覆蓋
	**/
	viper.SetConfigName("config")  // 這里設(shè)置要讀取文件的名稱
	viper.SetConfigType("yaml")    // 這里設(shè)置要讀取文件的類型
	viper.AddConfigPath(".")       // 這里設(shè)置讀取文件的文件夾路徑,可以設(shè)置多個路徑,將會依次從這幾個路徑中去尋找config.yaml文件
	viper.AddConfigPath("./test3") // 設(shè)置的第二個備選路徑
	viper.AddConfigPath("./test")  // 設(shè)置的最后一個備選路徑
	err := viper.ReadInConfig() // ReadInConfig用于讀取查找到的配置文件
	if err != nil {
		panic(fmt.Errorf("fatal error config file: %w", err)) // 返回失敗信息,可能由于文件不存在等
	}
	viper.Set("newconf", true) // 設(shè)置新參數(shù),上面講述了Set和SetDefault的區(qū)別,這里不再贅述
	viper.WriteConfig()
	viper.SafeWriteConfig()
	viper.WriteConfigAs("./test2/config.yaml")
	viper.SafeWriteConfigAs("./test2/config.yaml")
	/**
		WriteConfig用于將配置信息寫入新的配置文件中,新文件的名稱和后綴采用使用第20,21行所設(shè)置的SetConfigName("config")
		和viper.SetConfigType("yaml")。WriteConfigAs可以指定新的配置文件的路徑(帶有文件名的路徑),
		而WriteConfig則寫入你所定義的第一個AddConfigPath,即第22行:“ viper.AddConfigPath(".") ”
		方法名帶有Safe的則代表如果文件已經(jīng)存在,則會報錯。不帶有Safe的方法在文件已經(jīng)存在時會覆蓋文件。
		這里將會把第11,12,13行和第31行設(shè)置的參數(shù)連同config.yaml文件原本的參數(shù)一同寫入到新文件中
	**/
	var yamlExample = []byte(`
Hacker: true
name: steve
hobbies:
- skateboarding
- snowboarding
- go
clothing:
jacket: leather
trousers: denim
age: 35
eyes : brown
beard: true
`)
	viper.SetConfigType("yaml")
	viper.ReadConfig(bytes.NewBuffer(yamlExample))
	x := viper.GetString("name")
	y := viper.Get("name")
	fmt.Println(x)
	fmt.Println(y)
	/**
		除了從文件中讀取配置信息以外,也可以從字節(jié)流中讀取,如上所示,GetString方法返回key所對應(yīng)的字符串類型的value,
		同樣你也可以使用GetInt,GetBool等等,Get方法返回一個接口,因此它可以適用于所有的類型。
	**/
	viper.RegisterAlias("loud", "Verbose")
	viper.Set("verbose", true)
	viper.Set("loud", true)
	viper.GetBool("loud")
	viper.GetBool("verbose")
	/**
		RegisterAlias用于注冊別名,也就意味著你接下來的所有關(guān)于loud的操作都可以用vervose來代替,
		但他只作為你程序運行過程中一個方便使用的別名,其所表達的配置信息中不含有verbose這一屬性,
		也就是說最終你寫入新配置文件時,verbose將不會出現(xiàn)
		最后注意?。。。涸趘aper中,配置信息的key是不區(qū)分大小寫的,因此上方的Verbose和verbose等同
	**/
    viper.AutomaticEnv()
	// 讀取環(huán)境變量
	viper.SetEnvPrefix("CGO")
	/** 設(shè)置環(huán)境變量前綴:CGO_,如果是cgo,將自動轉(zhuǎn)變?yōu)榇髮憽?
		這樣在使用get讀取環(huán)境變量時可以只讀取與項目有關(guān)的配置
	**/
	viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
	// 將viper.Get(key) key字符串中'.'和'-'替換為'_',
	// 這使得使用Get獲取值的時候可以使用其他符號來代替_
	viper.BindEnv("ENABLED")                  // 將"CGO_ENABLED"綁定到"ENABLED"
	viper.BindEnv("enabled")                  // 匹配環(huán)境變量時自動轉(zhuǎn)換為大寫,但key仍然是小寫
	viper.BindEnv("user.secret-id", "GOROOT") // 當含有兩個參數(shù)時,前綴不會生效
	viper.BindEnv("PATH", "PATH")
	fmt.Println(viper.Get("user.secret-id"))
	fmt.Println(viper.GetString("ENABLED"))
	fmt.Println(viper.GetString("enabled"))
	fmt.Println(viper.GetString("PATH"))
	// viper在讀取環(huán)境變量時是區(qū)分大小寫的
}

golang常用庫viper解讀

1. viper的介紹

viper是go一個配置解決方案的庫。

  • 支持各種配置文件,如JSON,TOML, YAML, HCL, envfile和Java屬性配置文件
  • 支持監(jiān)聽文件變化以及重新讀取配置
  • 支持從環(huán)境變量讀取配置
  • 支持從遠程配置系統(tǒng)(etcd或Consul)讀取配置,并能監(jiān)聽遠程配置修改
  • 支持從命令行標志Flag讀取配置,比如搭配cobra使用

viepr直接使用go get命令安裝即可

$ go get github.com/spf13/viper

2.viper的使用

//加載本地配置
func InitInFromLocal() (*viper.Viper, error) {
	home := "./config"
	var v = viper.New()
	//cobra.CheckErr(err)
	fmt.Printf("UserHomeDir", home)
	// Search config in home directory with name ".cobra" (without extension).
	v.AddConfigPath(home)
	v.SetConfigType("toml")
	v.SetConfigName("pro")
	v.AutomaticEnv()
	if err := v.ReadInConfig(); err == nil {
		fmt.Println("Using config file success:", v.ConfigFileUsed())
	} else {
		fmt.Println("Using config file:%s", err)
	}
	fmt.Println(v.GetString("app_name_pro"))
	return v, nil
}
//加載遠端配置
func InitConfigFromRemote() error {
	// 遠程配置
	viper.AddRemoteProvider("etcd", "http://127.0.0.1:2379", "config/app.yml")
	//v.SetConfigType("json")
	viper.SetConfigFile("app.yml")
	viper.SetConfigType("yml")
	if err := viper.ReadRemoteConfig(); err == nil {
		log.Printf("use config file -> %s\n", viper.ConfigFileUsed())
	} else {
		return err
	}
	return nil
}
//設(shè)置默認值
	viper.SetDefault("email", "NAME HERE <EMAIL ADDRESS>")
	viper.SetDefault("license", "apache")
//綁定單個值cobra
	viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
	viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
//綁定多個值
	viper.BindPFlags(rootCmd.PersistentFlags())
//獲取環(huán)境變量
    v.AutomaticEnv()
	v.AllowEmptyEnv(true)
	v.SetEnvPrefix("CK")
//監(jiān)聽文件變化
// 監(jiān)聽到文件變化后的回調(diào)
v.OnConfigChange(func(e fsnotify.Event) {
  fmt.Println("Config file changed:", e.Name)
  fmt.Println(v.Get("db.redis.passwd"))
})
v.WatchConfig()
//從viper寫入文件
	viper.SetConfigFile("./hello.yml")
	viper.WriteConfig()
//獲取子配置項
    viper.Sub("db")

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Golang switch語句的具體使用

    Golang switch語句的具體使用

    switch 語句提供了一種簡潔的方式來執(zhí)行多路分支選擇,本文主要介紹了Golang switch語句的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Golang如何使用go.mod配置加載本地模塊

    Golang如何使用go.mod配置加載本地模塊

    這篇文章主要介紹了Golang如何使用go.mod配置加載本地模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • go中值傳遞和指針傳遞的使用

    go中值傳遞和指針傳遞的使用

    在Go語言中,使用&和*可以分別取得變量的地址和值,解引用未初始化或為nil的指針會引發(fā)空指針異常,正確的做法是先進行nil檢查,此外,nil在Go中用于多種類型的空值表示,值傳遞和指針傳遞各有適用場景,通常小型數(shù)據(jù)結(jié)構(gòu)優(yōu)先考慮值傳遞以減少解引用開銷
    2024-10-10
  • Go語言題解LeetCode455分發(fā)餅干示例詳解

    Go語言題解LeetCode455分發(fā)餅干示例詳解

    這篇文章主要為大家介紹了Go語言題解LeetCode455分發(fā)餅干示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 使用Go語言生成二維碼并在命令行中輸出

    使用Go語言生成二維碼并在命令行中輸出

    二維碼(QR code)是一種矩陣條碼的標準,廣泛應(yīng)用于商業(yè)、移動支付和數(shù)據(jù)存儲等領(lǐng)域,在開發(fā)過程中,我們可能需要在命令行中顯示二維碼,這可以幫助我們快速生成和分享二維碼信息,本文將介紹如何使用Go語言生成二維碼并在命令行中輸出,需要的朋友可以參考下
    2023-11-11
  • golang?channel管道使用示例解析

    golang?channel管道使用示例解析

    這篇文章主要介紹了golang?channel管道使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • golang?gorm框架數(shù)據(jù)庫的連接操作示例

    golang?gorm框架數(shù)據(jù)庫的連接操作示例

    這篇文章主要為大家介紹了golang?gorm框架數(shù)據(jù)庫操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決

    goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決

    這篇文章主要為大家介紹了goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 一文初探Go語言中的reflect反射包

    一文初探Go語言中的reflect反射包

    這篇文章主要和大家分享一下Go語言中的reflect反射包,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • go語言制作的zip壓縮程序

    go語言制作的zip壓縮程序

    這篇文章主要介紹了go語言制作的zip壓縮程序,其主體思路是首先創(chuàng)建一個讀寫緩沖,然后用壓縮器包裝該緩沖,用Walk方法來將所有目錄下的文件寫入zip,有需要的小伙伴參考下。
    2015-03-03

最新評論