Viper学习与使用

news2024/9/20 23:31:24

文章目录

      • 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 main

import (
    "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 string
        Port int
    }
}

var config Config

err := 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.coloradmin.cn/o/2150429.html

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

相关文章

数仓工具:datax

datax可以理解为sqoop的优化版, 速度比sqoop快 因为sqoop底层是map任务,而datax底层是基于内存 DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定…

4款音频转文字在线转换工具帮你解锁新的记录模式。

越来越多的人都知道使用一些工具来将音频直接转换成文字,这样便省去了手动输入的麻烦。而且使用音频进行记录也能够提高工作的效率,像会议记录,课堂教学记录,采访录音等。如果大家有需要将自己的音频转成文字,可以试试…

PDF——压缩大小的方法

方法一:QQ浏览器->格式转换->PDF转纯图PDF

【C++】STL----stack和queue常见用法

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:C从小白到高手 🌹往期回顾🌹:【C】list常见用法 🔖 流水不争,争的是滔滔不息。 文章目录 一、stack的介绍s…

KTH7823——16 位高精度低延时霍尔磁编码器可编程 ABZ 和 PWM 输出模式角度传感器

KTH7823 是一款高精度绝对角度霍尔传感器芯片,最高 16 位分辨率绝对角度输出,可 实现在轴向和离轴场合下的无接触式磁场角度测量。不论转速范围在 0-120000rpm 之间, KTH7823 都能快速准确地输出角度信息,适用于需要精准角…

7个提升网站分页体验的 CSS 和 JavaScript 代码片段

文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具,能帮助用户更轻松…

鱼类计数与识别系统源码分享

鱼类计数与识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

【C语言】⾃定义类型:联合和枚举

⾃定义类型:联合和枚举 1. 联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对⽐1.4 联合体⼤⼩的计算1.5 联合的⼀个练习 2. 枚举类型2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使⽤ 1. 联合体 1.1 联合体类型的声明 像结构体…

滚珠花键与滚珠丝杆的区别与应用

在机械工业中,经常使用滚珠花键这种传动元件,人们经常拿它与滚珠丝杆相比较,甚至与之混淆。事实上,它们是不同的,滚珠花键和滚珠丝杆在机械传动领域中各有其独特的作用和特点。那么,两者之间的区别是什么呢…

list(二) (list模拟实现)

首先进行大框架 先写基本的结点类 有data next prev template<class T>class ListNode//或者使用struct 就不用在写public声明公有{public://这里不仅仅是成员函数 成员变量也要公有化 ListNode<T>* _next;ListNode<T>* _prev;T _data;}之后是链表list类…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

围剿Model Y,小米SUV也来拼刺刀了

文 | AUTO芯球 作者 | 雷慢 马斯克真是被小米雷军盯上了&#xff0c; 前面小米SU7死磕Model 3&#xff0c; 现在小米SUV又来打Model Y了&#xff0c; 别不信啊&#xff0c;就刚刚&#xff0c;小米SUV出现了最大的曝光&#xff0c; 外观谍照&#xff0c;内饰中控台都曝光了…

RflySim工具链常见问题答疑

1. RflySim结合硬件能不能实现无人机颜色巡线呢&#xff1f; 可以&#xff0c;内置有一个通过相机识别来攻击小球的实验&#xff0c;可见&#xff1a;【RflySim安装路径】\RflySimAPIs\8.RflySimVision\1.BasicExps\1-VisionCtrlDemos\e3_ShootBall&#xff0c;不过要想实现无人…

Linux 进程3

进程地址空间 CPU读取数据都需要地址&#xff0c;在计算机中所有东西都是一种数据&#xff0c;包括我们的进程。 这是一个进程空间示意图&#xff0c;操作系统通过task_struct结构体链表来管理每一个进程&#xff0c;结构体里面有一个指针指向操作系统为进程开辟的一段空间&am…

博导团队指导、解读实验结果、SCI论文润色

表观组&#xff1a; DAP-seq:转录因子-DNA互作研究工具 ATAC-seq :染色质开放程度研究工具 H3K4me3 ChIP-seq:组蛋白甲基化修饰工具 BS-seq :DNA甲基化研究工具 H3K27ac ChIP-seq:组蛋白乙酰化修饰研究工具 Cut&Tag:转录因子研究工具 ChIP-seq:转录因子-DNA互作工具 互作组…

HTTP 教程

HTTP/HTTPS 简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff0c;超文本传输安全协议&#xff09;是用于在网络中传输信息的两种主要协议。它们定义了客户端和服务器…

PDF样本册如何分享到朋友圈

​想象一下&#xff0c;你刚刚参加了一场行业盛会&#xff0c;获取了一份包含最新行业动态、优秀案例的PDF样本册。你迫不及待地想要分享给身边的朋友&#xff0c;与他们共同学习、探讨。然而&#xff0c;传统的分享方式要么依赖纸质版&#xff0c;要么通过电子邮件&#xff0c…

C++模拟实现list:list、list类的初始化和尾插、list的迭代器的基本实现、list的完整实现、测试、整个list类等的介绍

文章目录 前言一、list二、list类的初始化和尾插三、list的迭代器的基本实现四、list的完整实现五、测试六、整个list类总结 前言 C模拟实现list&#xff1a;list、list类的初始化和尾插、list的迭代器的基本实现、list的完整实现、测试、整个list类等的介绍 一、list list本…

LeetCode讲解篇之220. 存在重复元素 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 我们可以考虑存储数组中连续indexDiff个数字&#xff0c;这样我们只需要在这连续的indexDiff个数字中查找相差小于等于valueDiff的两个数字的问题 对于该查找问题&#xff0c;我们可以考虑使用以valueDiff大小为一个桶&a…

自动化测试常用函数

目录 一、元素的定位 1、cssSelector 2、xpath &#xff08;1&#xff09;xpath 语法 1、获取HTML页面所有的节点 2、获取HTML页面指定的节点 3、获取一个节点中的直接子节点 4、获取一个节点的父节点 5、实现节点属性的匹配 6、使用指定索引的方式获取对应的节点内容…