怎么在Golang利用毒蛇包对yaml的配置信息进行读取

  介绍

怎么在Golang利用毒蛇包对yaml的配置信息进行读取?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1,安装

去github.com/spf13/viper

2,编写一个yaml的配置文件,config.yaml

数据库:   ,主持人:127.0.0.1   用户:大敌;根   ,dbname:测试   ,pwd: 123456

编写学习脚本main.go,读取配置。yaml配置信息

package  main    import  (   ,“fmt"   ,“os"   ,“;github.com/spf13/viper"   )   ,   func  main (), {   ,//获取项目的执行路径   ,道路,err :=, os.Getwd ()   ,if  err  !=, nil  {   ,恐慌(err)   ,}   ,   ,config :=, viper.New (),   ,config.AddConfigPath(路径),,//设置读取的文件路径   ,config.SetConfigName (“config"),//设置读取的文件名   ,config.SetConfigType (“yaml"),//设置文件的类型   ,//尝试进行配置读取   ,if  err :=, config.ReadInConfig ();, err  !=, nil  {   ,恐慌(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,执行去主要运行。去

输出:

127.0.0.1   根   测试   123456年

ok !

<>强补充:去基于毒蛇实现配置文件热更新及其源码分析

去第三方库github.com/spf13/viper实现了对配置文件的读取并注入到结构中,好用方便。

其中以

viperInstance :=, viper.New(),//,毒蛇实例   viperInstance.WatchConfig ()   viperInstance.OnConfigChange (func (e  fsnotify.Event), {   ,log.Print (“Config  file 更新!”)   ,viperLoadConf (viperInstance),//,加载配置的方法   })

可实现配置的热更新,不用重启项目新配置即可生效(实现热加载的方法也不止这一种,比如以文件的上次修改时间来判断等)。

为什么这么写?这样写为什么就能立即生效?基于这两个问题一起来看看毒蛇是怎样实现热更新的。

上面代码的核心一共两处:WatchConfig()方法,OnConfigChange()方法.WatchConfig()方法用来开启事件监听,确定用户操作文件后该文件是否可正常读取,并将内容注入到毒蛇实例的配置字段,先来看看WatchConfig()方法:

func  (v  *毒蛇),WatchConfig (), {   ,go  func (), {   ,,//,建立新的监视处理程序,开启一个协程开始等待事件//,,,从I/O完成端口读取,将事件注入到事件对象中:Watcher.Events   观察者的不同之处是,err :=, fsnotify.NewWatcher (),   ,if  err  !=, nil  {   ,log.Fatal (err)   ,}   ,defer  watcher.Close ()   ,   ,//have 用watch 我方表示歉意,entire  directory 用pick  up 重命名/atomic  saves  a  cross-platform 拷贝   ,文件名,err :=, v.getConfigFile (),   ,if  err  !=, nil  {   ,log.Println(“错误:“,,呃)   ,返回   ,}   ,   ,configFile :=, filepath.Clean(文件名),,//配置文件E: \ etc \ bizsvc \ config.yml   ,configDir, _ :=, filepath.Split (configFile),//, E: \ \ bizsvc \   ,   ,done :=, (chan  bool)   ,go  func (), {   ,for  {   ,select  {   ,,,//,读取的事件对象有两个属性,名称为E: \ etc \ bizsvc \ config.yml Op为写(对文件的操作)   ,case  event :=, & lt; -watcher.Events:   ,//清除内部的…和他前面的元素,清除当前路径,用来判断操作的文件是否是configFile   if 才能filepath.Clean (event.Name),==, configFile  {   ,,,//,如果对该文件进行了创建操作或写操作   if 才能event.Op& fsnotify.Write ==, fsnotify.Write  | |, event.Op& fsnotify.Create ==, fsnotify.Create  {   err 才能;:=,v.ReadInConfig ()   if 才能;err  !=, nil  {   log.Println才能(“错误:“,,呃)   ,,}   v.onConfigChange才能(事件)   ,,}   ,,}   ,case  err :=, & lt; -watcher.Errors:   ,,,,//,有错误将打印   log.Println才能(“错误:“,,呃)   ,}   ,}   }()大敌;   ,watcher.Add (configDir)   & lt;完成   ,}()   }

怎么在Golang利用毒蛇包对yaml的配置信息进行读取