Viper学习与使用

文章目录

      • 1. **安装 Viper**
      • 2. **Viper 的基本功能**
      • 3. **基本用法**
        • 3.1 从文件读取配置
        • 配置文件 (`config.yaml`):
        • 3.2 设置默认值
        • 3.3 从环境变量读取
        • 3.4 从多个来源读取配置
        • 3.5 动态监控配置文件的变化
        • 3.6 结合命令行标志 (Cobra)
      • 4. **高级用法**
        • 4.1 使用远程配置
        • 4.2 读取嵌套配置
        • 4.3 将配置项绑定到结构体
      • 5. **错误处理**
      • 6. **总结**
        • 常用资源

Viper 是一个非常流行且强大的 Go 语言配置管理库,支持多种配置文件格式(如 JSON、TOML、YAML、HCL、envfile)以及从环境变量、命令行参数等不同来源读取配置,适合构建复杂的应用程序。以下是关于 Viper 的学习和使用指南。

1. 安装 Viper

首先,需要在项目中安装 viper 包。可以通过以下命令来安装:

go get github.com/spf13/viper

2. Viper 的基本功能

Viper 的核心功能包括:

  • 读取 JSON、TOML、YAML 等格式的配置文件。
  • 读取环境变量。
  • 读取命令行标志(通常与 Cobra 库结合使用)。
  • 监控配置文件的变化。
  • 设置默认值。
  • 读取远程配置系统(如 etcd、Consul)。

3. 基本用法

3.1 从文件读取配置

Viper 支持从多种格式的文件中读取配置。以下是从 YAML 文件读取配置的示例:

package mainimport ("fmt""github.com/spf13/viper"
)func main() {// 设置配置文件名(不需要文件后缀)viper.SetConfigName("config")// 设置配置文件类型viper.SetConfigType("yaml")// 设置配置文件的路径,可以是相对路径或绝对路径viper.AddConfigPath(".")  // 当前目录// 读取配置文件if err := viper.ReadInConfig(); err != nil {panic(fmt.Errorf("Fatal error config file: %s \n", err))}// 获取配置项fmt.Println("App Name:", viper.GetString("app.name"))fmt.Println("Port:", viper.GetInt("app.port"))
}
配置文件 (config.yaml):
app:name: "MyApp"port: 8080
3.2 设置默认值

Viper 允许为配置项设置默认值,在读取配置文件或环境变量失败时,可以使用这些默认值:

viper.SetDefault("app.name", "DefaultApp")
viper.SetDefault("app.port", 3000)
3.3 从环境变量读取

Viper 还可以从环境变量中读取配置项。通过设置环境变量前缀,你可以通过环境变量来覆盖配置文件中的值。

viper.SetEnvPrefix("MYAPP")  // 设置前缀,环境变量将以 MYAPP 开头
viper.BindEnv("app.name")     // 绑定环境变量appName := viper.GetString("app.name")
fmt.Println("App Name from Env:", appName)

在运行程序时,可以使用 export MYAPP_APP_NAME=EnvironmentApp 设置环境变量。

3.4 从多个来源读取配置

Viper 允许从多个来源(配置文件、环境变量、命令行参数等)组合读取配置。例如,可以优先读取环境变量,环境变量不存在时再读取配置文件的值。

viper.AutomaticEnv()  // 自动从环境变量中读取// 先尝试从环境变量读取,如果环境变量没有,再从配置文件读取
appPort := viper.GetInt("app.port")
fmt.Println("App Port:", appPort)
3.5 动态监控配置文件的变化

Viper 允许实时监控配置文件的变化,当配置文件被修改时,Viper 会重新读取文件内容。你可以通过以下方式启用文件监控:

viper.WatchConfig()  // 监控配置文件的变化
viper.OnConfigChange(func(e fsnotify.Event) {fmt.Println("Config file changed:", e.Name)
})
3.6 结合命令行标志 (Cobra)

Viper 和 Cobra 通常一起使用,Cobra 是一个用于构建 CLI 应用的库,它支持命令行参数解析。通过 Cobra,你可以轻松地将命令行参数绑定到 Viper:

rootCmd := &cobra.Command{Use:   "myapp",Short: "My App Description",Run: func(cmd *cobra.Command, args []string) {fmt.Println("App Port:", viper.GetInt("app.port"))},
}rootCmd.PersistentFlags().Int("port", 8080, "App Port")
viper.BindPFlag("app.port", rootCmd.PersistentFlags().Lookup("port"))

4. 高级用法

4.1 使用远程配置

Viper 支持从远程配置中心(如 etcdConsul)读取配置。这种方式适用于需要在分布式环境下动态修改配置的场景。你可以通过 Viper 的 RemoteConfig 包来实现。

viper.AddRemoteProvider("consul", "localhost:8500", "config/myapp")
viper.SetConfigType("json")  // 配置文件的类型// 读取远程配置
err := viper.ReadRemoteConfig()
if err != nil {fmt.Println("Failed to read remote config:", err)
}
4.2 读取嵌套配置

Viper 支持读取嵌套结构的配置项。假设你的配置文件包含嵌套的结构,例如:

app:database:user: "admin"password: "secret"

你可以使用以下方式读取嵌套的值:

dbUser := viper.GetString("app.database.user")
dbPassword := viper.GetString("app.database.password")
fmt.Println("DB User:", dbUser)
fmt.Println("DB Password:", dbPassword)
4.3 将配置项绑定到结构体

为了更方便地使用配置,可以将配置项直接绑定到 Go 语言的结构体:

type Config struct {App struct {Name stringPort int}
}var config Configerr := viper.Unmarshal(&config)
if err != nil {fmt.Println("Unable to decode into struct:", err)
}fmt.Println("App Name:", config.App.Name)
fmt.Println("App Port:", config.App.Port)

5. 错误处理

在使用 Viper 读取配置时,如果出现错误,应该进行适当的错误处理。比如读取配置文件失败时,可以抛出错误信息并选择退出程序。

if err := viper.ReadInConfig(); err != nil {fmt.Printf("Error reading config file, %s", err)
}

6. 总结

Viper 是 Go 中非常强大的配置管理库,提供了读取文件、环境变量、命令行参数、远程配置等多种方式。通过与其他库如 Cobra 结合,可以轻松构建灵活、强大的应用程序配置系统。

常用资源
  • Viper 官方文档: [https://github.com/spf13/viper](

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

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

相关文章

BUUCTF-MISC-隐藏的钥匙

下载题目文件,获得了一张格式为jpg的路飞图片 按照习惯,首先使用十六进制编译器打开文件,这里我使用winhex打开文件 首先考虑有没有flag直接隐写在文件中,按照图示步骤查找flag字段 我们查到了flag,通过经验和图中base…

MySQL的缓存策略

目录 一、MySQL 缓存方案用来干什么 二、提升MySQL访问性能的方式 1、读写分离(MySQL的主从复制) 2、连接池 3、异步连接 三、缓存方案是怎么解决的 1、缓存与MySQL一致性状态分析 2、制定热点数据的读写策略 四、缓存方案问题的解决方法 1、缓…

正点原子阿尔法ARM开发板-IMX6ULL(八)——串口通信(寄存器解释)(补:有源蜂鸣器)

文章目录 一、蜂鸣器(待,理解)1.1 第一行1.2 第二行1.3 第三行 二、串口原理2.1 通信格式2.2 UART寄存器 一、蜂鸣器(待,理解) 1.1 第一行 对于第一行,首先先到fsl_iomuxc文件里面寻找IOMUXC_S…

人力资源数据集分析(一)_t-test、卡方检验和描述性统计

数据入口:人力资源分析数据集 - Heywhale.com 数据说明 字段说明EmpID唯一的员工IDAge年龄AgeGroup年龄组Attrition是否离职BusinessTravel出差:很少、频繁、不出差DailyRate日薪Department任职部门:研发部门、销售部门、人力资源部门Dista…

【VUE3.0】如何得到一张像素风格的图片?

目录 引言网络途径获取代码转换已有的图片0. 先看效果1. 上传图片,这个没什么好说的,前端上传图片基本操作。2. 通过滑动条提供一个1-10的数字,用于放缩图片画质。3. 函数拿到图片资源后先对图片进行缩小100倍尺寸处理,此时画质已…

服务器非法关闭后MySQL服务启动失败

在写这篇文章前,我弄好了,写完之后把成功安装的几个MySQL都删除了,只留了最后测试成功的服务“mysql-test” ,然后点击运行,发现又出现上图的错误。心态炸了。 本以为定位到问题了,但是这个错误让我迷茫了。我只能临时…

为什么你的广告规模无法扩大

许多跑facebook的广告主可能都遇到过这样的情况,小额测试广告的时候效果不错,一旦加预算想扩大规模广告往往就会崩掉,始终无法把广告提升一个level,如果你尝试了很多投放策略调整都无法挽救的话,可能问题是出在广告素材上。 对于一…

多重指针变量(n重指针变量)实例分析

0 前言 指针之于C语言,就像子弹于枪械。没了子弹的枪械虽然可以用来肉搏,却失去了迅速解决、优雅解决战斗的能力。但上了膛的枪械也非常危险,时刻要注意是否上了保险,使用C语言的指针也是如此,要万分小心,…

杀死端口占用的进程

1、查看端口的进程,以9023为例 (1)方法1 netstat -tunpl|grep 9023 (2)方法2 ss -tulpan |grep 9023 (3)方法3 netstat -ntlp |grep 9023 (4)方法4 lsof -i:9023 …

A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

FAM: Feature Aggregation Module,Circle with R represents removing feature maps of non-selected categories 辅助信息 权重有1.3G,不建议复现

变压器空载时是否有必要做无功补偿

在电力系统中,变压器作为关键设备之一,其运行状态对整个系统的功率质量和效率具有重要影响。关于“变压器空载时是否有必要做无功补偿”这一问题,答案取决于具体的应用场景、系统需求以及经济性考虑。以下将从变压器空载特性、无功补偿的原理…

360手机黑科技“位置穿越”功能修复 360位置穿越使用

​ 360手机刷机 360手机黑科技 360手机位置穿越 360手机位置修复 360手机站:360os.top 资源免费下载: os.360os.top 备用资源站:360手机-360手机刷机RootTwrp 360手机位置穿越 360手机位置穿越‌,是一款虚拟定位软件,无需进行r…

毕业设计选题:基于springboot+vue+uniapp的驾校报名小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

块匹配算法简介(上)

图像中的运动估计方法大致分为两类:光流法和块匹配算法(BMA,Block Matching Algorithm)。本文将介绍BMA的相关内容,包括基本原理、相似度计算准则与常见的几种搜索方法,如三步法、四步法、钻石搜索法等。 1. 背景 视频中相邻帧往往存在大量的相似内容,即只有局部的一些…

算法课习题汇总(2)

整数划分问题 将正整数n表示成一系列正整数之和&#xff0c;nn1n2…nk(n1>n2>…>nk,k>1)。正整数n的这种表示称为正整数n的划分。 思路&#xff1a; n表示待划分数&#xff0c;m表示最大减数。 #include<iostream> using namespace std;int q(int n, int…

JIT(即时编译)技术

介绍一下JIT优化技术&#xff1f; 想要把高级语言转变成计算机认识的机器语言有两种方式&#xff0c;分别是编译和解释&#xff0c;虽然Java转成机器语言的过程中有一个步骤是要编译成字节码&#xff0c;但是&#xff0c;这里的字节码并不能在机器上直接执行。 JVM中内置了 解释…

记软件开发者画图(UML),使用WPS应用制图

目录 前言 一、什么是UML 二、使用什么画图工具 三、示例 ​四、IntelliJ IDEA 2021快速生成UML图 前言 做软件开发的从写第一个示例程序到最后写项目程序避不开的需要设计画图&#xff0c;所以今天我们就来梳理一下‌UML&#xff08;统一建模语言&#xff09;图形需要画…

LINUX网络编程:TCP(1)

目录 1.认识Tcp的报头 2.确认应答机制&#xff08;ACK&#xff09; 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号&#xff0c;之后会介…

T9-猫狗识别2(暂时版qaq)

T9周&#xff1a;猫狗识别2 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****五、训练模型****六、模型评估****七、预测**八、总结&#xff08;暂时&#xff09; &…

倒排索引(反向索引)

倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎和数据库管理系统中常用的一种数据结构&#xff0c;用于快速检索文档集合中的文档。在全文搜索场景中&#xff0c;倒排索引是一种非常高效的手段&#xff0c;因为它能够快速定位到包含特定关键词的所有文档。 1、基本…