Go 语言中强大的配置管理库—Viper

Viper 是 Go 语言中强大的配置管理库,广泛用于云原生和微服务开发中。它支持多种配置文件格式(如 YAML、JSON、TOML 等)、环境变量、命令行参数以及远程配置管理。

Viper 的主要功能

1. 支持多种格式的配置文件

• YAML、JSON、TOML、HCL、Java properties 等。

2. 读取环境变量

• 支持从系统环境变量加载配置。

3. 支持命令行参数

• 可以与 pflag 或 flag 集成,读取命令行标志。

4. 动态配置更新

• 可以监听文件变化,实时更新配置。

5. 远程配置支持

• 支持从 Consul、Etcd 等远程配置服务加载配置。

6. 默认值设置

• 为配置项设置默认值,在未定义时使用。

7. 嵌套配置支持

• 支持嵌套结构的配置项。

安装

在项目中安装 Viper:

go get -u github.com/spf13/viper

基本使用示例

1. 读取 YAML 配置文件

假设有一个 config.yaml 文件:

app:name: "MyApp"version: "1.0.0"
server:port: 8080host: "localhost"

使用 Viper 读取配置:

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 reading config file: %w", err))}// 获取配置值appName := viper.GetString("app.name")appVersion := viper.GetString("app.version")serverPort := viper.GetInt("server.port")serverHost := viper.GetString("server.host")fmt.Printf("App: %s v%s running on %s:%d\n", appName, appVersion, serverHost, serverPort)
}

2. 设置默认值

viper.SetDefault("app.name", "DefaultApp")
viper.SetDefault("server.port", 3000)appName := viper.GetString("app.name")      // DefaultApp
serverPort := viper.GetInt("server.port")  // 3000

3. 读取环境变量

可以绑定环境变量,便于动态设置:

package mainimport ("fmt""github.com/spf13/viper"
)func main() {// 绑定环境变量viper.AutomaticEnv()// 设置别名(可选)_ = viper.BindEnv("server.port", "APP_SERVER_PORT")// 获取环境变量的值serverPort := viper.GetInt("server.port")fmt.Printf("Server Port from ENV: %d\n", serverPort)
}

运行时设置环境变量:

export APP_SERVER_PORT=9090
go run main.go
# Output: Server Port from ENV: 9090

4. 动态监听配置文件变化

支持热加载配置文件的功能:

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

5. 嵌套结构绑定

支持将配置绑定到结构体:

package mainimport ("fmt""github.com/spf13/viper"
)type Config struct {App struct {Name    string `mapstructure:"name"`Version string `mapstructure:"version"`}Server struct {Port int    `mapstructure:"port"`Host string `mapstructure:"host"`}
}func main() {viper.SetConfigFile("config.yaml")if err := viper.ReadInConfig(); err != nil {panic(fmt.Errorf("fatal error reading config file: %w", err))}var config Configif err := viper.Unmarshal(&config); err != nil {panic(fmt.Errorf("unable to decode config into struct: %w", err))}fmt.Printf("App: %s v%s running on %s:%d\n",config.App.Name, config.App.Version, config.Server.Host, config.Server.Port)
}

6. 命令行参数结合 pflag 使用

package mainimport ("fmt""github.com/spf13/pflag""github.com/spf13/viper"
)func main() {// 定义命令行标志pflag.Int("port", 8080, "Server port")pflag.Parse()// 将命令行标志绑定到 Viper_ = viper.BindPFlags(pflag.CommandLine)// 获取值serverPort := viper.GetInt("port")fmt.Printf("Server Port: %d\n", serverPort)
}

运行时设置参数:

go run main.go --port=9090
# Output: Server Port: 9090

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

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

相关文章

鸿蒙-封装loading动画

import { AnimatorOptions, AnimatorResult } from "kit.ArkUI" export enum SpinImageType { RedLoading, WhiteLoading } Component export struct SpinImage { Prop type?: SpinImageType Prop url?: string State animatedValue: number 0 …

今日复盘103周五(189)

1、早上,看了一下二手书里的十种主要游戏类型的相关内容。 其实收获不大,主要是引发思考。 2、白天,持续多日的模式1的白模原型关卡结束,开始转做准正式资源的关卡, 但进度低于预期。 并不是改改参数那么简单轻松&a…

OJ随机链表的复制题目分析

题目内容: 138. 随机链表的复制 - 力扣(LeetCode) 分析: 这道题目,第一眼感觉非常乱,这是正常的,但是我们经过仔细分析示例明白后,其实也并不是那么难。现在让我们一起来分析分析…

uc/os-II 原理及应用(一) 嵌入式实时系统基本概念

基于嵌入式实时操作系统μCOS-II原理及应用(第2版)-任哲 自行网上寻找资源。 计算机系统的中分为计算机硬件系统与计算机软件系统,计算机软件系统由上到下分为,应用软件,系统软件,操作系统;操作系统一般在计算机软件的最低层&…

C++ 并发专题 - std::promise 和 std::future 介绍

一:概述 std::promise 和 std::future 是C标准库的两种工具,主要用于实现线程之间的异步通信。它们属于C并发库的一部分,提供了一种安全,优雅的方式来在线程之间传递结果或状态。 二:std::promise 介绍 std::promise …

【Multisim用74ls92和90做六十进制】2022-6-12

缘由Multisim如何用74ls92和90做六十进制-其他-CSDN问答 74LS92、74LS90参考

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中,弱指针(TWeakPtr )也是一种智能指针类型,主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下,提供一种可…

数据库知识汇总2

一. 范式 定义:范式是符合某一种级别的关系模式的集合。 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式; 一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一…

C# 设计模式(结构型模式):桥接模式

C# 设计模式(结构型模式):桥接模式 在软件设计中,我们经常会遇到系统的变化频繁,或者需要灵活扩展功能的场景。这时,桥接模式(Bridge Pattern)便显得尤为重要。桥接模式是一个结构型…

Flash Attention V3使用

Flash Attention V3 概述 Flash Attention 是一种针对 Transformer 模型中注意力机制的优化实现,旨在提高计算效率和内存利用率。随着大模型的普及,Flash Attention V3 在 H100 GPU 上实现了显著的性能提升,相比于前一版本,V3 通…

【51单片机零基础-chapter6:LCD1602调试工具】

实验0-用显示屏LCD验证自己的猜想 如同c的cout,前端的console.log() #include <REGX52.H> #include <INTRINS.H> #include "LCD1602.h" int var0; void main() {LCD_Init();LCD_ShowNum(1,1,var211,5);while(1){;} }实验1-编写LCD1602液晶显示屏驱动函…

【网络】ARP表、MAC表、路由表

ARP表 网络设备存储IP-MAC映射关系的表项&#xff0c;便于快速查找和转发数据包 ARP协议工作原理 ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;地址解析协议&#xff0c;能够将网络层的IP地址解析为数据链路层的MAC地址。 1.主机在自己的ARP缓冲区中建…

Ubuntu22.04双系统安装记录

1.Ubuntu24.04在手动分区时&#xff0c;没有efi选项&#xff0c;需要点击分区界面左下角&#xff0c;选择efi的位置&#xff0c;然后会自动创建/boot/efi分区&#xff0c;改到2GB大小即可。 2.更新Nvidia驱动后&#xff0c;重启电脑wifi消失&#xff0c;参考二选一&#xff1a…

Python Notes 1 - introduction with the OpenAI API Development

Official document&#xff1a;https://platform.openai.com/docs/api-reference/chat/create 1. Use APIfox to call APIs 2.Use PyCharm to call APIs 2.1-1 WIN OS.Configure the Enviorment variable #HK代理环境&#xff0c;不需要科学上网(价格便宜、有安全风险&#…

【Python其他生成随机字符串的方法】

在Python中&#xff0c;除了之前提到的方法外&#xff0c;确实还存在其他几种生成随机字符串的途径。以下是对这些方法的详细归纳&#xff1a; 方法一&#xff1a;使用random.randint结合ASCII码生成 你可以利用random.randint函数生成指定范围内的随机整数&#xff0c;这些整…

leetcode hot 100 跳跃游戏

55. 跳跃游戏 已解答 中等 相关标签 相关企业 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则…

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…

01.02周二F34-Day44打卡

文章目录 1. 这家医院的大夫和护士对病人都很耐心。2. 她正跟一位戴金边眼镜的男士说话。3. 那个人是个圆脸。4. 那个就是传说中的鬼屋。5. 他是个很好共事的人。6. 我需要一杯提神的咖啡。7. 把那个卷尺递给我一下。 ( “卷尺” 很复杂吗?)8. 他收到了她将乘飞机来的消息。9.…

Spring Boot项目中使用单一动态SQL方法可能带来的问题

1. 查询计划缓存的影响 深入分析 数据库系统通常会对常量SQL语句进行编译并缓存其执行计划以提高性能。对于动态生成的SQL语句&#xff0c;由于每次构建的SQL字符串可能不同&#xff0c;这会导致查询计划无法被有效利用&#xff0c;从而需要重新解析、优化和编译&#xff0c;…

【Rust自学】10.2. 泛型

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 题外话&#xff1a;泛型的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整个第10章全都是Rust的重难点&#xff01;&#xf…