每日一库:使用Viper处理Go应用程序的配置

news/发布时间2024/8/25 9:31:15

在开发Go应用程序时,处理配置是一个常见的需求。配置可能来自于配置文件、环境变量、命令行参数等等。Viper是一个强大的库,可以帮助我们处理这些配置。

什么是Viper?

Viper是一个应用程序配置解决方案,用于Go应用程序。它支持JSON、TOML、YAML、HCL、envfile和Java properties配置文件格式。它还支持环境变量、命令行标志、远程配置系统(如etcd或Consul),并且可以直接监控配置文件的变化。

如何使用Viper?

读取配置文件

首先,我们需要告诉Viper去哪里找配置文件,以及如何读取它们。这可以通过以下代码实现:

viper.SetConfigName("config") // 配置文件名(不带后缀)
viper.SetConfigType("yaml") // 如果配置文件名没有扩展名,需要设置此项
viper.AddConfigPath("/etc/appname/")   // 查找配置文件所在的路径
viper.AddConfigPath("$HOME/.appname")  // 多次调用以添加多个搜索路径
err := viper.ReadInConfig() // 查找并读取配置文件
if err != nil { // 处理读取配置文件的错误panic(fmt.Errorf("Fatal error config file: %s \n", err))
}

获取配置值

一旦Viper读取了配置文件,我们就可以使用Get函数来获取配置值:

port := viper.GetInt("port")
databaseDriver := viper.GetString("database.driver")

设置默认值

Viper也允许我们设置配置的默认值。这在配置项未在配置文件中定义,但我们又需要一个默认值的情况下非常有用:

viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")

使用环境变量

Viper可以读取环境变量:

viper.AutomaticEnv()
databaseUrl := viper.Get("DATABASE_URL")

使用命令行标志

Viper也可以与标准库的flag包一起使用,以处理命令行标志:

var cfgFile stringfunc init() {flag.StringVar(&cfgFile, "c", "", "config file")flag.Parse()
}func main() {if cfgFile != "" { // 如果指定了配置文件,则解析指定的配置文件viper.SetConfigFile(cfgFile)err := viper.ReadInConfig()if err != nil {log.Fatalf("Error reading config file, %s", err)}}// ...
}

监控配置变化并重新加载配置

Viper甚至可以监控配置文件的变化,并在文件变化时重新加载配置:

viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {fmt.Println("Config file changed:", e.Name)
})

最后

Viper是一个强大的库,可以帮助我们处理Go应用程序的配置。它支持多种配置源,包括配置文件、环境变量、命令行参数等等,使得处理配置变得简单而直观。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意


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

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

使用SimpleDateFormat获取指定时区时间

使用SimpleDateFormat把时间戳转换成指定格式的、指定时区的字符串。摘要:使用SimpleDateFormat把时间戳转换成指定格式的、指定时区的字符串。SimpleDateFormat是Java中的一个日期格式化类,继承了DateFormat,可以实现日期时间和时间字符串的相互转换。为了把时间正确地转换…

学信息系统项目管理师第4版系列11_信息安全管理

信息安全管理1. 信息安全基础 1.1. 保密性(Confidentiality) 1.1.1. 信息不被未授权者知晓的属性 1.1.2. 确保信息不暴露给未授权的实体或进程 1.2. 完整性(Integrity) 1.2.1. 信息是正确的、真实的、未被篡改的、完整无缺的属性 1.2.2. 只有得到允许的人才能修改数据,并且能…

Spring 03 Spring+Mybatis整合

配置类 jdbc.propertiesjdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3307/myb?useSSL=false&useUnicode=true&characterEncoding=UTF-8 jdbc.username=root jdbc.password=123 MybatisConfid.javapackage com.config;import com.github.page…

kmp算法详解

引入 kmp算法要解决的就是用on的时间复杂度模式串p在文本串T中的匹配问题 过程字符串下标从1开始 对于文本串T(上)和模式串p(下)T.size()=n , p.size()=m 设T[i]和p[j]为正在接受比对的一对字符如果j<m-1&&T[i+1]==p[j+1],那么i++,j++。如果T[i+1]!=p[j+1],那么我…

2023河南萌新联赛第(五)场

A. 买爱心气球(博弈)输入3 3 1 3 3 5 2输出Alice Alice Bob点击查看代码 #include<bits/stdc++.h> #define int long long #define endl "\n"using namespace std;const int N = 2e5 + 10;int n, m, f;void solve() {cin >> n >> m;if(n % 3 == …

2023河南萌新联赛第(二)场

A. 自动收小麦机(循环并查集)输入样例14 1 2 1 1 4 5 2 2 2 3 4输出样例110说明在第4格放出水流后,水流会流向第3格,由于第3格高度比第4格低,所以水流继续向左流向第2格,因为平地水流只能流2格,所以到达第2格后水流停止,收获的小麦数量为1 + 4 + 5 = 10输入25 2 2 1 1 …

红队技巧7:分割文件,webshell管理工具分段传输

红队技巧7:分割文件,webshell管理工具分段传输 前言 在实战攻防中可能会出现webshell管理工具因为上传的工具太大导致上传失败 此时可以在本机中将文件平均分为多份,然后再用webshell管理工具传输,再合起来实验开始 1.分割 linux命令 split -n 2 fscan64.exe生成两个文件xaa xa…

完全二叉树的创建与遍历

创建一棵完全二叉树(递归方式)(创建方法仅使用与完全二叉树) 层序遍历完全二叉树(遍历算法适用于所有二叉树):利用队列FIFO的性质 中序遍历完全二叉树(递归方式,遍历算法适用于所有二叉树) 先序遍历完全二叉树(递归方式,遍历算法适用于所有二叉树) 后序遍历完全二…

高效的浏览 Linux 目录结构:pushd和popd命令

有时候,通过命令来在 Linux 文件系统导航是一件非常痛苦的事情,特别是对于一些新手。通常情况下,我们主要使用cd(改变目录)命令在 Linux 文件系统之间移动。更多技术干货详见www.linuxprobe.com在这个教程中,我们将讨论两个相关的命令:pushd和popd,使用它们可以高效的浏…

学习笔记3

程序设计语言必备要素和技能 对于Python、C和Java这三门常见的编程语言,它们都有一些共同的必备要素和技能。语法和语义:编程语言的语法和语义是这个语言的基础。这包括了熟悉变量、数据类型、运算符、控制流程等基本语法结构,以及了解编程语言的特性和约束。数据结构与算法…

Redis搭建集群架构

使用docker搭建 6.x 版本以后的镜像 docker 支持部署集群模式,由于 Redis 要求集群至少要有三个主节点,因此本次测试搭建了三主三从的 Redis 集群。 不基于 Host 网络模式 配置docker-compose.yml文件 version: "3"networks:redis-cluster:driver: bridgeipam:conf…

1.多线程(实现方式,常用方法,生命周期)

多线程(实现方式,常用方法,生命周期) 概述:可以让程序同时做多件事情; 可以提高效率; 只要你想让多个事情同时运行就需要用到多线程;如: 软件中的耗时操作、所有的聊天软件、所有的服务器‘并发和并行:并发:在同一时刻,有多个指令在单个CPU上交替执行; 并行:在同一时刻,有…

STM32之步进电机

步进电机 学习资料:野火电机应用开发实战指南 双极性步进电机(上):控制模式 |文章 | MPS (monolithicpower.cn) 爱上半导体---步进电机的工作原理步进电机的介绍 步进电机又称为脉冲电机,是一种将电脉冲信号转换成相应的角位移或线位移的电动机。每输入一个脉冲信号,转子就…

封装全局异常处理

目录1 定义错误码类2 定义业务异常类3 全局异常处理器4 使用5 前端请求效果总结 1 定义错误码类 ​ 可以定义各种错误码枚举,比如业务,系统相关的报错信息 /*** 错误代码* 错误码** @author leovany* @date 2023/09/23*/ public enum ErrorCode {SUCCESS(0, "success&qu…

根据周数计算月

问题:如何根据周数计算月 假设:以每周第一天为标准,一周从周一开始计 函数公式解决:=MONTH(DATE(A2,1,B2*7-WEEKDAY(DATE(A2,1,1),3))) 以周数乘以7计算出当年第一周的最后一天,再一个数推到元旦。所减的数字从周一至周日依次是0-6,正好可以用Weekday提取,第二参数用3。…

基于Python + SnowNLP实现一个文本情感分析系统

当你浏览社交媒体、新闻或任何数字内容时,你有没有想过背后的技术是如何分析和理解这些文本的情感的?有没有想过在数百万条评论、帖子或文章中,如何快速地识别出其中的积极和消极情绪?在这篇文章中,我们将揭示其中的奥秘,并教你如何使用Python和SnowNLP来轻松地实现一个文…

使用sqoop export命令将hive数据导入mysql

描述一下 因为我前两天的测试里面,用的是另外一种方法,所以今天想要尝试一下sqoop export的方法,这个方法我之前也试过,但是一直报错,但是!我又来啦!!! 相关步骤 自己设置一个数量不多的csv文件:然后按照之前的步骤:上传,导入数据库:然后在mysql里面同时创建一个与…

主流大语言模型的技术原理细节

1.比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节:tokenizer、位置编码、Layer Normalization、激活函数等。2. 大语言模型的分布式训练技术:数据并行、张量模型并行、流水线并行、3D 并行、零冗余优化器 ZeRO、CPU 卸载技术 ZeRo-offload、混合精度训练、激活重计算技术、…
推荐文章