介绍
怎么在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的配置信息进行读取