婷婷综合国产,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性色tv| 精品区一区二区| 久久精品亚洲精品国产欧美| 日韩极品在线观看| 日韩精品最新网址| 成人av在线资源网站| 国产精品电影一区二区三区| 99精品久久只有精品| 亚洲国产精品成人综合色在线婷婷| 黄网站免费久久| 亚洲精品一线二线三线无人区| 高清在线观看日韩| 午夜av区久久| 亚洲国产精品av| 国产三级一区二区| 国产欧美一区二区三区在线老狼| 成人午夜激情影院| 免费在线欧美视频| 国产精品久久福利| 亚洲综合色噜噜狠狠| 精品国产伦一区二区三区观看体验| 欧美一级一级性生活免费录像| 大白屁股一区二区视频| 成人国产一区二区三区精品| 色综合视频在线观看| 国内精品伊人久久久久av一坑| 国产在线精品国自产拍免费| 亚洲综合在线观看视频| 久久久国际精品| 欧美二区在线观看| eeuss影院一区二区三区| 国产精品99久久久久久久vr| 日本系列欧美系列| 亚洲一区二区三区影院| 精品一二三四区| 蜜桃久久久久久久| 五月婷婷激情综合| 国产美女精品一区二区三区| av一区二区三区黑人| 欧美三级电影在线看| 91玉足脚交白嫩脚丫在线播放| 国产精品18久久久久久久久久久久| 99在线视频精品| 欧美大片一区二区| 亚洲男帅同性gay1069| 国产精品欧美综合在线| 欧美mv日韩mv国产网站app| 自拍偷拍亚洲欧美日韩| 中文字幕精品在线不卡| 蜜乳av一区二区三区| 91网站最新地址| 久久影院视频免费| 国产欧美日韩亚州综合| 天天av天天翘天天综合网色鬼国产| 成人黄色软件下载| 亚洲精品一区在线观看| 亚洲国产精品久久人人爱蜜臀| 亚洲国产综合人成综合网站| av高清久久久| 国产亚洲精久久久久久| 国产自产视频一区二区三区| 欧美人与z0zoxxxx视频| 欧美成人精精品一区二区频| 亚洲综合视频在线观看| 99久久综合精品| 国产三级一区二区三区| 久久99久久99| 91精品国产欧美一区二区成人| 亚洲免费高清视频在线| 成人午夜视频在线观看| 国产女同互慰高潮91漫画| 久久 天天综合| 91精品麻豆日日躁夜夜躁| 精品国产露脸精彩对白| 久久精品国产亚洲一区二区三区| 国产一区二区三区美女| 精品国产精品一区二区夜夜嗨| 日韩高清一区在线| 欧美一卡二卡在线| 婷婷综合另类小说色区| 欧美另类一区二区三区| 性做久久久久久免费观看 | 久久午夜色播影院免费高清 | 日韩一区日韩二区| 视频一区二区中文字幕| 欧美丰满少妇xxxxx高潮对白| 日韩极品在线观看| 欧美大片一区二区| 国产福利一区二区| 欧美一区二区三区视频在线| 久久精品国产第一区二区三区| 日韩女优av电影| 久国产精品韩国三级视频| 久久精品亚洲麻豆av一区二区| 成人一区在线看| 一区二区三区在线免费观看| 欧美另类变人与禽xxxxx| 久久99精品一区二区三区三区| 久久综合狠狠综合久久激情| 国产91对白在线观看九色| 亚洲国产三级在线| 久久久.com| 欧美色涩在线第一页| 国产精品一卡二卡| 一区二区三区丝袜| 欧美大片一区二区| 91丨九色丨黑人外教| 日韩av中文在线观看| 国产欧美精品一区二区三区四区| 欧美影院精品一区| 一区二区三区在线免费视频| 欧美不卡在线视频| 色婷婷av一区二区三区之一色屋| 奇米一区二区三区av| 中文字幕一区二区三| 日韩精品一区二区三区视频| 91亚洲国产成人精品一区二三| 久久精品国产99| 一区二区三区电影在线播| 欧美精品一区视频| 欧美日韩成人在线| 99re在线视频这里只有精品| 裸体在线国模精品偷拍| 亚洲三级电影全部在线观看高清| 欧美mv日韩mv国产网站app| 日本韩国一区二区| 99久久精品一区二区| 国产精品一区二区视频| 美女国产一区二区三区| 香蕉久久夜色精品国产使用方法 | 成人动漫精品一区二区| 久久成人av少妇免费| 午夜国产精品影院在线观看| 一区二区三区在线影院| 欧美国产综合一区二区| 久久人人97超碰com| 日韩欧美国产综合一区| 欧美精品日日鲁夜夜添| 欧美亚洲综合一区| 欧美在线播放高清精品| 亚洲一区二区美女| 亚洲综合一区二区| 亚洲一区二区综合| 图片区日韩欧美亚洲| 亚洲日本在线视频观看| 亚洲三级在线看| 亚洲欧美日韩电影| 亚洲欧美日韩国产中文在线| 亚洲欧美色一区| 亚洲男人天堂av网| 亚洲一区在线观看免费观看电影高清 | 91精品在线麻豆| 欧美一区二区高清| 精品国产伦一区二区三区观看方式 | 日韩欧美国产一二三区| 91精品在线麻豆| 久久老女人爱爱| 国产精品久久久久国产精品日日| 亚洲视频一区在线| 亚洲夂夂婷婷色拍ww47 | 自拍偷拍亚洲欧美日韩| 日韩一区在线看| 一区二区三区四区精品在线视频 | 亚洲欧美在线视频| 亚洲国产一区二区三区| 日韩av中文字幕一区二区| 国产剧情在线观看一区二区| zzijzzij亚洲日本少妇熟睡| 色素色在线综合| 91精品国产综合久久蜜臀| 亚洲精品一区二区在线观看| 中文字幕在线一区| 亚洲国产综合91精品麻豆| 日韩影院精彩在线| 国产mv日韩mv欧美| 欧美三电影在线| 久久久久久97三级| 亚洲综合久久av| 激情小说欧美图片| 91国模大尺度私拍在线视频| 91精品国产欧美日韩| 国产精品国产精品国产专区不片| 亚洲精品视频观看| 久久久久9999亚洲精品| 亚洲色图视频免费播放| 免费在线欧美视频| 色综合欧美在线| 2023国产精品| 亚洲国产欧美一区二区三区丁香婷| 久久成人免费网| 欧美性猛交xxxx黑人交| 国产欧美精品日韩区二区麻豆天美| 亚洲国产日韩综合久久精品| 国产盗摄女厕一区二区三区 | jizzjizzjizz欧美| 91精品国产入口在线| 一区二区三区中文在线| 国产成人在线视频免费播放| 欧美剧情片在线观看| 樱桃国产成人精品视频|