前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go:配置文件解析库 spf13/viper简介(Go应用程序的完整配置解决方案)

Go:配置文件解析库 spf13/viper简介(Go应用程序的完整配置解决方案)

作者头像
Freedom123
发布2024-03-29 14:06:34
发布2024-03-29 14:06:34
65800
代码可运行
举报
文章被收录于专栏:DevOpsDevOps
运行总次数:0
代码可运行

简介

在我们开发过程中,像数据库信息、邮件配置和其他的第三方服务密钥等这些固定的信息都会写在配置文件中,而配置文件又有多种表现形式和格式,有 JSON, TOML, YAML各种格式,而且测试环境,开发环境和生产环境用的配置文件也不是同一份。

Viper是Go应用程序的完整配置解决方案,Viper可以被认为是您的所有应用程序配置需求的注册表。viper 支持Yaml、Json、 TOML、HCL 等格式,读取非常的方便。

  • 设置默认值
  • 从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置
  • 文件读取配置信息
  • 实时监控和重新读取配置文件(可选)
  • 从环境变量中读取
  • 从远程配置系统(etcd或Consul)读取并监控配置变化
  • 从命令行参数读取配置
  • 从buffer读取配置
  • 调用函数设置配置信息

Viper为什么NB

在构建现代应用程序时,你无需担心配置文件格式;你想要专注于构建出色的软件。Viper的出现就是为了在这方面帮助你的。

Viper能够为你执行下列操作:

  • 查找、加载和反序列化JSON、TOML、YAML、HCL、INI、envfile和Java properties格式的配置文件。
  • 提供一种机制为你的不同配置选项设置默认值。
  • 提供一种机制来通过命令行参数覆盖指定选项的值。
  • 提供别名系统,以便在不破坏现有代码的情况下轻松重命名参数。
  • 当用户提供了与默认值相同的命令行或配置文件时,可以很容易地分辨出它们之间的区别。

Viper会按照下面的优先级。每个项目的优先级都高于它下面的项目:

  • 显示调用Set设置值
  • 命令行参数(flag)
  • 环境变量
  • 配置文件
  • key/value存储
  • 默认值

核心能力

1、可以设置默认值 2、可以加载多种格式的配置文件,如JSON,TOML,YAML,HCL和Java属性配置文件 3、应用程序运行过程中,保持监听和重新读取配置文件 4、可以从环境变量读取配置 5、可以从远程配置系统读取配置 6、可以读取命令行标志作为配置 7、可以从缓冲区中读取 8、设置显式的值

代码示例

1.利用viper写toml格式的文件
代码语言:javascript
代码运行次数:0
运行
复制
func init(){
	viper.SetConfigFile("hello.toml")//文件名
	viper.Set("Address","0.0.0.0:9090")//统一把Key处理成小写 Address->address
	err := viper.WriteConfig()//写入文件
	if err != nil { // Handle errors reading the config file
		panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}
}

运行一下,会发现当前目录会出现一个hello.toml的文件,相对于写入配置文件的操作。

2. 利用viper读取配置文件
代码语言:javascript
代码运行次数:0
运行
复制
viper.SetConfigFile("hello.toml")
err := viper.ReadInConfig() // 会查找和读取配置文件
if err != nil { // Handle errors reading the config file
	panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
Address = viper.GetString("Address")
//key取Address或者address都能取到值,反正viper转成小写处理
fmt.Println(Address)
3. 监听配置变化
代码语言:javascript
代码运行次数:0
运行
复制
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
    fmt.Println("配置发生变更:", e.Name)
})

不建议在实际开发中使用热加载功能,因为即使配置热加载了,程序中的代码也不一定会热加载。例如:修改了服务监听端口,但是服务没有重启,这时候服务还是监听在老的端口上,会造成不一致。

4. 设置默认值
代码语言:javascript
代码运行次数:0
运行
复制
viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
5. 使用标志

Viper 支持 Pflag 包,能够绑定 key 到 Flag。我们可以将标志绑定到 Viper,这样就可以使用 viper.Get() 获取标志的值。 绑定单个标志

代码语言:javascript
代码运行次数:0
运行
复制
viper.BindPFlag("token", pflag.Lookup("token"))

还可以绑定一组现有的 pflags(pflag.FlagSet):

代码语言:javascript
代码运行次数:0
运行
复制
viper.BindPFlags(pflag.CommandLine) 

注意:工作中,这个常用到,一般都是命令行优先与配置文件,这样配置统一就是viper来管理,最后一次反序列化到我们的配置实例中。

6. 反序列化

Viper 可以支持将所有或特定的值解析到结构体、map 等。可以通过两个函数来实现:

代码语言:javascript
代码运行次数:0
运行
复制
Unmarshal(rawVal interface{}) error
UnmarshalKey(key string, rawVal interface{}) error

type config struct { 
    Port int 
    Name string 
    PathMap string `mapstructure:"path_map"`
}
var C config
err := viper.Unmarshal(&C)
if err != nil { 
    t.Fatalf("unable to decode into struct, %v", err)
}

Viper 在后台使用 github.com/mitchellh/mapstructure 来解析值,其默认情况下使用mapstructure tags。当我们需要将 Viper 读取的配置反序列到我们定义的结构体变量中时,一定要使用 mapstructure tags。

注意:工作中,这个常用到,这块就是把我们从配置文件中读到内容,反序列化特定的struct实例,方便代码使用。

小结

参考地址:https://blog.csdn.net/studyhard232/article/details/86499317 https://blog.csdn.net/inthat/article/details/123621507

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • Viper为什么NB
  • 核心能力
  • 代码示例
    • 1.利用viper写toml格式的文件
    • 2. 利用viper读取配置文件
    • 3. 监听配置变化
    • 4. 设置默认值
    • 5. 使用标志
    • 6. 反序列化
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档