viper配置文件读取管理库 一个支持12种文件类型,5种远程协议的配置文件管理和加载工具库 使用方法示例

news2024/9/23 9:32:46

viper是一个不错的配置文件管理库, 他支持的配置文件类型依次有 "json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "tfvars", "dotenv", "env", "ini" ; 支持的远程服务协议有 "etcd", "etcd3", "consul", "firestore", "nats" 

go依赖库安装 go get github.com/spf13/viper

viper常用的使用

viper在其内部,加载后就会自动初始化一个Viper对象, 在其包内对大部分的方法都提供了对应的字节访问函数, 所以我们可以像使用函数一样使用他内部的Viper对象的方法。 如:viper.GetString("xxx")函数, 在内部他实际上是访问的Viper的方法

以下说明viper的几种常用使用方式

通过指定配置目录和文件名获取配置信息

通过指定配置文件目录, 配置文件名 即可自动加载支持的配置文件信息,在这种情况下他们的加载优先级为.json类型的配置文件优先级最高, 最低是.ini配置文件 , 如果同目录下有多个同名的不同类型配置文件,则只会加载优先级高的那一个。

当然也可以通过  viper.SetConfigType("ini") 来指定加载的配置文件类型,这样 就只会加载符合条件的 名称.ini 的配置文件。

	viper.AddConfigPath("../config") // 指定配置文件目录 相对或者绝对目录
	viper.SetConfigName("config") // 设置配置文件名,这样的话 在配置目录小所有支持的文件后缀都可被读取
	viper.SetConfigType("ini") // 设置配置文件类型, 注意如果不指定则会尝试所有支持的文件类型
	viper.ReadInConfig() // 读取已经设置的配置文件
	// 获取配置信息
	pa:= viper.GetString("profile.active")
	log.Println(pa)

通过直接指定配置文件路径来加载配置信息

这种方式是通过 viper.SetConfigFile()函数来进行的, 注意这个函数仅仅是设置了配置文件,不会自动读取配置文件,要读取配置文件,需要手动执行 viper.ReadInConfig()读取配置文件 或者 viper.MergeInConfig() 读取并合并配置文件

// 设置配置文件名包含后缀 的相对与当前项目根目录的路径或者绝对路径
	// 如 config/config.yaml 这个主要用于加载配置目录以外的配置文件
	viper.SetConfigFile("config/config.yaml")
	viper.MergeInConfig() // 合并当前加入的配置文件

注意:使用viper.MergeInConfig() 读取并合并配置文件后,新的配置文件中的key会覆盖旧的key的内容。

通过reader直接读取和加载配置文件信息

这种方式用于我们自己读取配置文件后通过 viper.ReadConfig(in io.Reader) 来直接加载配置文件。 这种方式给我们提供了更好的灵活性, 可以随意加载需要的配置信息。

    // 读取默认的配置文件
	if data, err := os.ReadFile("config/config.yaml"); err != nil {
		log.Fatalf("读取默认配置文件 config/config.yaml 异常! %v", err)
	} else {
		viper.ReadConfig(bytes.NewReader(data)) // 直接读取配置文件信息
	}

通过 viper.MergeConfigMap(cfg map[string]any) 将已有的map数据加载到配置信息中

这种方式可以让我们通过函数viper.MergeConfigMap(cfg map[string]any)  把map数据直接加载到配置信息中。  注意这个也是合并方式,新的key会覆盖旧的key

获取环境变量中的配置信息

在使用viper.AutomaticEnv() 开启自动环境变量之后, 我们就可以像读取我们配置内容一样读取环境变量中的配置信息,

	viper.AutomaticEnv() // 自动环境变量 开启后可以直接使用环境变量的配置的key来作为 viper的key来获取对应的值
	goroot := viper.GetString("GOROOT") // 读取GOROOT环境变量 这个只有在启用AutomaticEnv后才有效
	log.Println(goroot)
	paths := viper.GetStringSlice("PATH")
	log.Println(paths)

通过Writexxx保存配置信息到文件

这里主要有2个函数可以保存配置信息到文件,即 viper.WriteConfig() 使用默认配置文件 和 viper.WriteConfigAs(filename string) 自定义配置文件, 另外还有 SafeWriteXxx 即他们对应的安全模式,即文件不存在时才写入。

Viper配置对象和初始化信息参考

注意这里的 New方法是在 init初始化方法里面被调用的。 表名只要我们一加载这个库 他就会被执行。


var v *Viper

type RemoteResponse struct {
	Value []byte
	Error error
}

func init() {
	v = New()
}

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
	configPermissions os.FileMode
	envPrefix         string

	// Specific commands for ini parsing
	iniLoadOptions ini.LoadOptions

	automaticEnvApplied bool
	envKeyReplacer      StringReplacer
	allowEmptyEnv       bool

	parents        []string
	config         map[string]any
	override       map[string]any
	defaults       map[string]any
	kvstore        map[string]any
	pflags         map[string]FlagValue
	env            map[string][]string
	aliases        map[string]string
	typeByDefValue bool

	onConfigChange func(fsnotify.Event)

	logger *slog.Logger

	// TODO: should probably be protected with a mutex
	encoderRegistry *encoding.EncoderRegistry
	decoderRegistry *encoding.DecoderRegistry
}

// New returns an initialized Viper instance.
func New() *Viper {
	v := new(Viper)
	v.keyDelim = "."
	v.configName = "config"
	v.configPermissions = os.FileMode(0o644)
	v.fs = afero.NewOsFs()
	v.config = make(map[string]any)
	v.parents = []string{}
	v.override = make(map[string]any)
	v.defaults = make(map[string]any)
	v.kvstore = make(map[string]any)
	v.pflags = make(map[string]FlagValue)
	v.env = make(map[string][]string)
	v.aliases = make(map[string]string)
	v.typeByDefValue = false
	v.logger = slog.New(&discardHandler{})

	v.resetEncoding()

	return v
}

当然这个库的使用不止这些,还有很多的功能, 比如配置文件自动监控,即修改后配置文件自动加载等功能, 这里就不一一列举了,有需要的自己下来用用就知道了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java:实现简单的验证码功能

效果 实现思路 验证码图片的url由后端的一个Controller生成,前端请求这个Controller接口的时候根据当前时间生成一个uuid,并把这个uuid在前端使用localStorage缓存起来,下一次还是从缓存中获取。 Controller生成验证码之后,把前…

Qt 学习第六天:页面布局

如何设计页面? 有个类似沙盒模式的玩法,Qt Widget Designer可以更好的帮助我们设计页面 点击.ui文件进入 右上方可以看到四种常见的布局: 四种布局 (一)水平布局horizontalLayout:QHBoxLayout H 是 hori…

c++实现B树(上)

哈喽啊!好久不见,甚是想念!失踪人口要回归了,时隔一个多月小吉我终于要更新blog了🎉。在停更的一个多月中,小吉也有在好好学习提升自己,立志给大家呈现好文章。  现在让我们进入正题吧&#xf…

初识C++:开启C++之旅

目录 1.C的第一个程序 2.namesapce命名空间域 2.1namespace的意义 2.2.2namespace的定义 2.3命名空间的使用 3.C输入/输出 4.缺省参数 5.函数重载 6.引用 6.1引用的特性 6.2引用的使用 1.C的第一个程序 c版本&#xff1a; #include<iostream>using std::cout…

kali安装wechart

前言&#xff1a; 突发奇想想在kali安装个wechart&#xff0c;试了下网上的很多&#xff0c;玩坏了一个虚拟机算是找到了一个不错的方法&#xff0c;这里记录下&#xff0c;防迷路 基础配置&#xff1a; 首先修改源&#xff1a; vim /etc/apt/sources.list 注释默认配置&…

EasyCVR视频汇聚平台:打造全栈视频监控系统的基石,解锁可视化管理与高效运维

随着科技的飞速发展&#xff0c;视频监控已成为现代社会不可或缺的一部分&#xff0c;广泛应用于社区、公共场所、工业领域等多个场景。EasyCVR视频汇聚平台&#xff0c;作为一款高性能的视频汇聚管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建全…

centos8 安装zookeeper

1&#xff1a;下载 zookeeper官网 解压&#xff1a;tar -zxvf apache-zookeeper-3.6.3.tar.gz 修改自己想要的文件目录 mv apache-zookeeper-3.6.3 zookeeper_3.6.3 备份一下 配置文件 cp zoo_sample.cfg zoo.cfg vim zoo.cfg 编辑日志文件和端口号

nginx实战演练

目录 一.Nginx架构和安装&#xff08;未完待续&#xff09; <1>.Nginx概述 <2>.Nginx架构和进程 <3>.Nginx模块 <4>.Nginx安装(编译安装) 二.Nginx基础配置 <1>.关闭debug <2>.将nginx软件添加到环境变量 <3>.开机自启动脚…

EmguCV学习笔记 VB.Net 2.5 Mat类、Matrix类和Image类的相互转换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…

基于Vue的MES生产制造执行系统

TOC springboot307基于Vue的MES生产制造执行系统 第1章 绪论 1.1 选题动因 到现在为止&#xff0c;互联网已经进入了千家万户&#xff0c;最普通的平民百姓也有属于自己的智能设备&#xff0c;计算机各种技术的储备也是相当的丰富&#xff0c;并且实现也是没有难度&#xf…

VSCode配置ssh免密连接远程服务器

我配置了免密设置(Windows利用ssh免密码登录Linux)&#xff0c;git bash已经能够正常连接了&#xff0c;但是vscode还是不行&#xff0c;很奇怪。 VSCode报错信息&#xff1a; [17:55:50.360] SSH Resolver called for "ssh-remote106.52.2.19", attempt 5, (Recon…

《机器学习》——运用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法的简单介绍下载OpenCV库实验内容实验结果完整代码自己手写数字传入模型中测试 KNN算法的简单介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重…

电压检测之比较电路

设计这款电路主要是本人在锂电池充电电路中挖了一个坑&#xff0c;对电源显示芯片的数据手册内容撰写不够详细的不好感受&#xff0c;所以自己根据比较电路的思想设计出了电压检测并反馈的电路&#xff0c;亦在提供一种电压检测的思想不需要借助ADC采集&#xff0c;在电路硬件上…

基于hive的海鲜交易数据分析系统设计与实现【hadoop、Flask、某东爬虫、sqoop、flume、mysql、hdfs】商品可换

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍研究背景国内外研究现状研究目的研究意义 关键技术理论介绍数据采集及预处理数据采集字段介绍数据预处理hadoop集群搭建及实现过程hive建表hive大数据分析 可视化展示店铺维度画像分…

AR 眼镜之-开关机定制-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 开关机定制 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;开机 Logo 2&#xff09;开机音效 3&#xff09;开机动画 4&#xff09;关机动画 5&#xff09;关机弹窗 2. &#x1f4a0; 开机 Logo…

C++笔试题汇总

C笔试题汇总记录 一、概述二、概念分类1. 结构体1. C 和 C 中 struct 有什么区别&#xff1f;2. C中的 struct 和 class 有什么区别&#xff1f; 2. 类相关1. 类的大小1. 空类的大小2. 一般非空类大小3. 有虚函数类4. 有虚函数类的继承5. 只有虚函数6. 静态数据成员 2. C的三大…

【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源

开门见山 帮别人弄了一台 格力G0245D&#xff0c;把找到的资源和教程分享一下 教程 这个写的很详细了格力手机色界G0245D-Root-最简指南 不过教程里刷rec这一步漏了加上电源键&#xff0c;加上就行了。 附加参考&#xff1a;格力手机2刷机 格力手机二代刷机 GREE G0215D刷机…

C++ 特殊类设计以及单例模式

目录 1 不能被拷贝 2 只能在堆上创建对象 3 只能在栈上创建对象 4 禁止在堆上创建对象 5 不能被继承的类 6 单例类 特殊类就是一些有特殊需求的类。 1 不能被拷贝 要设计一个防拷贝的类&#xff0c;C98之前我们只需要将拷贝构造以及拷贝赋值设为私有&#xff0c;同时只声明…

在HFSS中对曲线等结构进行分割(Split)

在HFSS中对曲线进行分割 我们往往需要把DXF等其他类型文件导入HFSS进行分析&#xff0c;但是有时需要对某一个曲线单独进行分割成两段修改。 如果是使用HFSS绘制的曲线&#xff0c;我们修改起来非常方便&#xff0c;修改参数即可。但是如果是导入的曲线&#xff0c;则需要使用…

代码随想录训练营 Day31打卡 贪心算法 part05 56. 合并区间 738. 单调递增的数字 968. 监控二叉树

代码随想录训练营 Day31打卡 贪心算法 part05 一、 力扣56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…