婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang使用第三方包viper讀取yaml配置信息操作

Golang使用第三方包viper讀取yaml配置信息操作

熱門標簽:地圖區域圖標注后導出 赤峰電銷 400開頭電話怎樣申請 杭州人工智能電銷機器人費用 利用地圖標注位置 官渡電銷外呼管理系統怎么收費 貴州電話智能外呼系統 江蘇呼叫中心外呼系統有效果嗎 谷歌美發店地圖標注

Golang有很多第三方包,其中的 viper 支持讀取多種配置文件信息。本文只是做一個小小demo,用來學習入門用的。

1、安裝

go get github.com/spf13/viper

2、編寫一個yaml的配置文件,config.yaml

database:
 host: 127.0.0.1
 user: root
 dbname: test
 pwd: 123456

3、編寫學習腳本main.go,讀取config.yaml配置信息

package main 
import (
 "fmt"
 "os" 
 "github.com/spf13/viper"
)
 
func main() {
 //獲取項目的執行路徑
 path, err := os.Getwd()
 if err != nil {
 panic(err)
 }
 
 config := viper.New() 
 config.AddConfigPath(path)  //設置讀取的文件路徑
 config.SetConfigName("config") //設置讀取的文件名
 config.SetConfigType("yaml") //設置文件的類型
 //嘗試進行配置讀取
 if err := config.ReadInConfig(); err != nil {
 panic(err)
 }
 
 //打印文件讀取出來的內容:
 fmt.Println(config.Get("database.host"))
 fmt.Println(config.Get("database.user"))
 fmt.Println(config.Get("database.dbname"))
 fmt.Println(config.Get("database.pwd")) 
}

4、執行go run main.go

輸出:

127.0.0.1
root
test
123456

ok!

補充:go基于viper實現配置文件熱更新及其源碼分析

go第三方庫 github.com/spf13/viper 實現了對配置文件的讀取并注入到結構中,好用方便。

其中以

viperInstance := viper.New() // viper實例
viperInstance.WatchConfig()
viperInstance.OnConfigChange(func(e fsnotify.Event) {
 log.Print("Config file updated.")
 viperLoadConf(viperInstance) // 加載配置的方法
})

可實現配置的熱更新,不用重啟項目新配置即可生效(實現熱加載的方法也不止這一種,比如以文件的上次修改時間來判斷等)。

為什么這么寫?這樣寫為什么就能立即生效?基于這兩個問題一起來看看viper是怎樣實現熱更新的。

上面代碼的核心一共兩處:WatchConfig()方法、OnConfigChange()方法。WatchConfig()方法用來開啟事件監聽,確定用戶操作文件后該文件是否可正常讀取,并將內容注入到viper實例的config字段,先來看看WatchConfig()方法:

func (v *Viper) WatchConfig() {
 go func() {
   // 建立新的監視處理程序,開啟一個協程開始等待事件
   // 從I/O完成端口讀取,將事件注入到Event對象中:Watcher.Events
 watcher, err := fsnotify.NewWatcher() 
 if err != nil {
 log.Fatal(err)
 }
 defer watcher.Close()
 
 // we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way
 filename, err := v.getConfigFile() 
 if err != nil {
 log.Println("error:", err)
 return
 }
 
 configFile := filepath.Clean(filename)  //配置文件E:\etc\bizsvc\config.yml
 configDir, _ := filepath.Split(configFile) // E:\etc\bizsvc\

 
 done := make(chan bool)
 go func() {
 for {
 select {
    // 讀取的event對象有兩個屬性,Name為E:\etc\bizsvc\config.yml,Op為write(對文件的操作)
 case event := -watcher.Events:
 // 清除內部的..和他前面的元素,清除當前路徑.,用來判斷操作的文件是否是configFile
  if filepath.Clean(event.Name) == configFile {
    // 如果對該文件進行了創建操作或寫操作
  if event.Opfsnotify.Write == fsnotify.Write || event.Opfsnotify.Create == fsnotify.Create {
  err := v.ReadInConfig()
  if err != nil {
  log.Println("error:", err)
  }
  v.onConfigChange(event)
  }
  }
 case err := -watcher.Errors:
     // 有錯誤將打印
  log.Println("error:", err)
 }
 }
 }() 
 watcher.Add(configDir)
 -done
 }()
}

其中,fsnotify是用來監控目錄及文件的第三方庫; watcher, err := fsnotify.NewWatcher() 用來建立新的監視處理程序,它會開啟一個協程開始等待讀取事件,完成 從I / O完成端口讀取任務,將事件注入到Event對象中,即Watcher.Events;

執行v.ReadInConfig()后配置文件的內容將重新讀取到viper實例中,如下圖:

執行完v.ReadInConfig()后,config字段的內容已經是用戶修改的最新內容了;

其中這行v.onConfigChange(event)的onConfigChange是核心結構體Viper的一個屬性,類型是func:

type Viper struct {
 // Delimiter that separates a list of keys
 // used to access a nested value in one go
 keyDelim string
 
 // A set of paths to look for the config file in
 configPaths []string
 
 // The filesystem to read config from.
 fs afero.Fs
 
 // A set of remote providers to search for the configuration
 remoteProviders []*defaultRemoteProvider
 
 // Name of file to look for inside the path
 configName string
 configFile string
 configType string
 envPrefix string
 
 automaticEnvApplied bool
 envKeyReplacer  *strings.Replacer
 
 config   map[string]interface{}
 override  map[string]interface{}
 defaults  map[string]interface{}
 kvstore  map[string]interface{}
 pflags   map[string]FlagValue
 env   map[string]string
 aliases  map[string]string
 typeByDefValue bool
 
 // Store read properties on the object so that we can write back in order with comments.
 // This will only be used if the configuration read is a properties file.
 properties *properties.Properties
 
 onConfigChange func(fsnotify.Event)
}

它用來傳入本次event來執行你寫的函數。為什么修改會立即生效?相信第二個疑問已經得到解決了。

接下來看看OnConfigChange(func(e fsnotify.Event) {...... })的運行情況:

func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) {
 v.onConfigChange = run
}

方法參數為一個函數,類型為func(in fsnotify.Event)) {},這就意味著開發者需要把你自己的執行邏輯放到這個func里面,在監聽到event時就會執行你寫的函數,所以就可以這樣寫:

 viperInstance.OnConfigChange(func(e fsnotify.Event) {
 log.Print("Config file updated.")
 viperLoadConf(viperInstance) // viperLoadConf函數就是將最新配置注入到自定義結構體對象的邏輯
 })

而OnConfigChange方法的參數會賦值給形參run并傳到viper實例的onConfigChange屬性,以WatchConfig()方法中的v.onConfigChange(event)來執行這個函數。

到此,第一個疑問也就解決了。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Golang 限流器的使用和實現示例
  • Golang實現請求限流的幾種辦法(小結)
  • 聊聊Golang中很好用的viper配置模塊
  • golang常用庫之配置文件解析庫-viper使用詳解
  • golang 使用 viper 讀取自定義配置文件
  • golang接口IP限流,IP黑名單,IP白名單的實例

標簽:武漢 保定 黔西 松原 宜春 河池 泰安 鷹潭

巨人網絡通訊聲明:本文標題《Golang使用第三方包viper讀取yaml配置信息操作》,本文關鍵詞  Golang,使用,第三方,包,viper,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang使用第三方包viper讀取yaml配置信息操作》相關的同類信息!
  • 本頁收集關于Golang使用第三方包viper讀取yaml配置信息操作的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩黄色一区二区| 国产91精品在线观看| 欧美日韩专区在线| 国产成人高清在线| 日本午夜一本久久久综合| 亚洲视频免费在线| 国产日韩欧美精品电影三级在线| 欧美三级电影精品| 91传媒视频在线播放| 99在线精品视频| 国产丶欧美丶日本不卡视频| 久久成人综合网| 精品中文字幕一区二区小辣椒| 亚洲国产视频网站| 亚洲第一福利视频在线| 亚洲狠狠爱一区二区三区| 亚洲午夜激情网站| 日韩主播视频在线| 五月激情六月综合| 丝袜脚交一区二区| 美国十次了思思久久精品导航| 免费在线观看日韩欧美| 九九九久久久精品| 高潮精品一区videoshd| 成人h动漫精品一区二区| 国产.欧美.日韩| 99视频一区二区三区| 91丨九色porny丨蝌蚪| 一本色道久久综合亚洲aⅴ蜜桃 | 色综合久久久久综合| 成人午夜视频网站| 91一区在线观看| 色综合亚洲欧洲| 欧美日本一区二区三区四区| 在线播放91灌醉迷j高跟美女| 欧美男生操女生| 精品国产1区二区| 国产欧美日韩精品a在线观看| 国产精品麻豆视频| 一区二区免费视频| 免费观看久久久4p| 成人免费黄色大片| 欧美日韩大陆一区二区| 欧美一区二区成人| 久久久久成人黄色影片| 亚洲欧美偷拍另类a∨色屁股| 亚洲最新视频在线播放| 日本91福利区| 高清不卡在线观看| 欧美丰满少妇xxxbbb| 久久精品夜夜夜夜久久| 一区二区三区四区乱视频| 精品一区二区三区免费视频| 97se狠狠狠综合亚洲狠狠| 日韩一级二级三级| 亚洲精品久久久蜜桃| 麻豆精品一区二区三区| 91麻豆免费观看| 久久影院午夜片一区| 亚洲国产另类精品专区| 国产成人丝袜美腿| 欧美性欧美巨大黑白大战| 久久免费精品国产久精品久久久久| 中文字幕一区免费在线观看| 亚洲va欧美va人人爽| 成人午夜视频在线观看| 精品国精品国产| 亚洲国产中文字幕在线视频综合| 国产高清成人在线| 日韩欧美激情在线| 亚洲综合激情小说| www.日本不卡| 国产欧美一二三区| 日韩一区精品字幕| 日本高清视频一区二区| 久久日一线二线三线suv| 午夜视频一区在线观看| 91亚洲精品久久久蜜桃| 国产欧美一区二区三区鸳鸯浴 | 国产丝袜在线精品| 免费视频最近日韩| 欧美日韩国产一级二级| 欧美经典一区二区| 久久精品国产亚洲高清剧情介绍| 91美女蜜桃在线| 国产精品国产自产拍高清av| 久久精品国产一区二区三区免费看| 在线精品视频小说1| 久久久国产精品麻豆 | 国产一区二区剧情av在线| 99久久精品99国产精品| 久久久久久久综合色一本| 狠狠色狠狠色综合| 欧美一区二区三区免费| 婷婷中文字幕综合| 欧美电影一区二区三区| 一区二区高清在线| 95精品视频在线| 中文欧美字幕免费| 国产91精品入口| 亚洲国产精华液网站w| 国产福利一区二区三区视频| 久久一留热品黄| 国产传媒一区在线| 久久久99精品免费观看| 国产成人在线视频免费播放| 久久天堂av综合合色蜜桃网| 国产日韩亚洲欧美综合| 国产欧美综合在线观看第十页| 欧美久久久久中文字幕| 风间由美一区二区av101| 亚洲激情男女视频| 亚洲高清视频在线| 亚洲不卡av一区二区三区| 欧美久久久久中文字幕| 韩国一区二区三区| 日韩—二三区免费观看av| av激情亚洲男人天堂| 国产精品一区二区免费不卡| 欧美视频第二页| 久久久久99精品国产片| 国产精品久久精品日日| 精品国产亚洲一区二区三区在线观看| 亚洲一区在线播放| 日韩亚洲欧美一区| 久久精品国产一区二区三| 国产日韩av一区| 91影视在线播放| 丝袜亚洲另类欧美| 欧美一区二区三区影视| 国产福利一区二区三区视频 | 男男gaygay亚洲| 国产无人区一区二区三区| 丁香天五香天堂综合| 亚洲欧美区自拍先锋| 日韩亚洲欧美在线| 成人国产在线观看| 日本欧美大码aⅴ在线播放| 精品999在线播放| 欧洲一区在线观看| 精品写真视频在线观看| 亚洲乱码中文字幕| 欧美妇女性影城| 91在线观看视频| 美女www一区二区| 综合中文字幕亚洲| 精品免费一区二区三区| 欧美亚洲综合久久| 国产伦精一区二区三区| 亚洲自拍偷拍综合| 久久精品视频一区二区三区| 欧美一区二区三区爱爱| 99久久伊人精品| 国产乱淫av一区二区三区| 亚洲人成人一区二区在线观看| 精品福利在线导航| 欧美中文字幕一区| 91丨九色丨尤物| 国产成人啪午夜精品网站男同| 日韩中文欧美在线| 亚洲视频综合在线| 国产精品每日更新在线播放网址| 欧美精品成人一区二区三区四区| 日本国产一区二区| aaa亚洲精品一二三区| 亚洲成人在线免费| 另类小说视频一区二区| 一本大道av一区二区在线播放| 欧美日韩一区二区欧美激情 | 欧美成人video| 在线精品视频一区二区三四| 欧美在线视频你懂得| 99久久婷婷国产综合精品| 国产一区免费电影| 久88久久88久久久| 久久精品国内一区二区三区| 亚洲国产aⅴ成人精品无吗| 久久久精品日韩欧美| 欧美大片一区二区| 久久亚洲一区二区三区四区| 欧美一区二区三区在线看| 日韩欧美国产综合一区| 91精品在线免费观看| 日韩美女视频在线| 91精品啪在线观看国产60岁| 91精品国产综合久久蜜臀| 欧美三片在线视频观看| 欧美日韩一区二区三区高清 | 久久日韩粉嫩一区二区三区| 亚洲精品国产a| 国产人久久人人人人爽| 欧美日本乱大交xxxxx| 一区二区理论电影在线观看| 中文字幕一区在线观看| 亚洲精品亚洲人成人网在线播放| 成人欧美一区二区三区黑人麻豆 | 粉嫩在线一区二区三区视频| 国内国产精品久久| 久久99精品视频| 亚洲国产aⅴ成人精品无吗|