(转)Golang第三方包Viper的使用
【摘要】
viper是一个简单好用的读取配置文件的第三方开源库,它支持多种类型配置的读写,包括json、yaml、环境变量、命令行等,使用该库可以免去一些繁琐的配置读取代码实现。
一 基本原理
当viper被调用来获取参数时,它的基本执行逻辑如下:
1.通过自己的内部实现,获取指定对象(配置文件,环境变量等)的内容
2.将获取的内容解析,得到键值对集合,并将其存入自身的storage中
3.等待ReadInConfig,或GetInt等方法取值
从上面描述可知,无论viper获取参数的来源是什么,最终的参数集合都是viper内部存放的键值对集合,也就可以使用viper.Get等方法获取,这种方案的好处就是,当配置来源发生变化时,只需要修改viper的来源解析代码,而不需要对已经嵌入业务代码的参数读写逻辑做任何修改。
二 使用方法
首先,通过命令go get github.com/spf13/viper 获取viper包
2.1 读取配置文件:
通过指定目录和文件名、文件类型,即可实现对指定文件的配置读取:
viper.SetConfigName("config") // 文件名 viper.AddConfigPath("/etc/appname/") // 文件路径 viper.AddConfigPath("$HOME/.appname") //可以使用多个文件路径 err := viper.ReadInConfig() // 将配置读入viper中存储 err != nil { // Handle errors reading the config file panic(fmt.Errorf("Fatal error config file: %s \n", err)) } ... //viper.GetString(...)
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | func TryLoadFromDisk() (*Config, error) { viper.SetConfigName(defaultConfigurationName) viper.AddConfigPath(defaultConfigurationPath) // Load from current working directory, only used for debugging viper.AddConfigPath(".") // 搜索路径,并读取配置数据 if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { return nil, err } else { return nil, fmt.Errorf("error parsing configuration file %s", err) } } // 初始化一个空的配置 *Config conf := New() //解析配置到 conf if err := viper.Unmarshal(conf); err != nil { return nil, err } return conf, nil } |
2.2 读取配置流:
viper.SetConfigType("yaml") // 设置配置的格式类型 var yamlExample = []byte(...) //...中为yml格式的字符串 viper.ReadConfig(bytes.NewBuffer(yamlExample)) //viper.ReadConfig()可以传入任//何实现io.Reader接口的对象 viper.Get("name") // 使用Get获取刚才读取的结果
2.3 设置参数默认值:
viper.SetDefault("ContentDir", "content") viper.SetDefault("LayoutDir", "layouts") viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
2.4 监听配置文件的读写事件:
配置监听事件后,当文件出现读写操作,就会触发事件,调用其声明好的方法,该步骤通常用于处理配置文件的重载,有时也额外用于文件监控功能
viper.WatchConfig() //启动监听 viper.OnConfigChange(func(e fsnotify.Event) { //注册文件监控的回调函数 fmt.Println("Config file changed:", e.Name) })
2.5 配置参数别名:
配置参数别名后,使用viper.Get方法时,传入原本的key或者传入别名都可以获取指定参数的值,通常用于美化/简化配置文件的参数格式
1 2 3 4 | viper.RegisterAlias( "base" , "别名" ) //注册别名 viper.Set( "base" , true ) viper.GetBool( "base" ) //结果: true viper.GetBool( "别名" ) //结果: true |
2.6 设置/覆盖参数值:
手动覆盖参数,此处不多赘述
viper.Set("base", true)
2.7 获取命令行参数
viper的命令行参数获取实际上是通过绑定flag对象实现的,使用方法相对其他几种配置来源稍微复杂一点
package main import ( "flag" "github.com/spf13/pflag" ) func main() { // 使用基础的flag包 flag.Int("flagname", 1234, "help message for flagname") //将flag转换为pflag pflag.CommandLine.AddGoFlagSet(flag.CommandLine) pflag.Parse() //通过bind,将命令行参数绑定到viper的内部键值对集合中 viper.BindPFlags(pflag.CommandLine) i := viper.GetInt("flagname") // 此处已可以获取参数
---------------------
原文来自【学领未来】,转载时请保留原文链接。
链接:http://bbs.learnfuture.com/topic/6900
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2016-12-09 linux压缩和解压缩命令大全
2016-12-09 linux配置tomcat以service方式启动(转)
2016-12-09 linux–nohup命令(转)
2016-12-09 Linux下查看系统版本号信息的方法(转)
2016-12-09 构建Logstash+tomcat镜像(让logstash收集tomcat日志)
2014-12-09 sdut 迷之容器(线段树+离散化)