配置一网打尽:Viper与项目的完美融合

简介: 配置一网打尽:Viper与项目的完美融合

1. viper 简介

基本概念

Viper 是一个 Go 语言的配置管理库,它提供了简单而强大的方式来处理应用程序的配置需求。无论是从文件、环境变量还是远程配置中获取配置信息,viper 都能胜任。

主要功能

从多种数据源读取配置信息

支持配置文件的多种格式,如 YAML、JSON 等

灵活的配置信息优先级控制

实时监控配置文件变化

读取环境变量

支持配置结构体绑定

提供设置默认值的功能

别名映射,方便使用不同名称的配置项

主要特点

轻量级且易于使用

多种配置文件格式支持

支持多种配置数据源

灵活的配置加载顺序

高度可定制化


 

2. 在项目中安装 viper

使用 Go mod 是现代 Go 项目的标配,导入 viper 只需要执行以下命令:


go get github.com/spf13/viper

如果需要获取 viper 的最新版本,可以直接从 GitHub 上获取最新的 release 版本,并通过 Go mod 集成到项目中。


go get github.com/spf13/viper@latest


 

3. viper 基本使用

3.1 读取配置信息(key/value 形式)

使用 viper 读取配置非常简单,以下是一个示例


package main
import (  "fmt"  "github.com/spf13/viper")
func main() {  viper.SetConfigFile("config.yaml")  if err := viper.ReadInConfig(); err != nil {    panic(fmt.Errorf("配置文件读取失败: %s \n", err))  }
  // 读取配置项  username := viper.GetString("username")  password := viper.GetString("password")
  fmt.Printf("用户名: %s, 密码: %s\n", username, password)}

Viper 支持多种配置文件格式,包括 YAML、JSON、TOML 等。在上述示例中,使用了 YAML 格式的配置文件,也可以选择其他格式。

3.2 配置信息优先级

Viper 支持多种配置信息来源,并通过优先级控制确定使用哪个值。优先级从高到低依次是:

命令行参数

环境变量

配置文件

默认值

3.3 监控配置文件变化

Viper 允许在运行时监控配置文件的变化,以便实现热更新。


package main
import (  "fmt"  "github.com/spf13/viper")
func main() {  viper.SetConfigFile("config.yaml")  viper.WatchConfig()  viper.OnConfigChange(func(e fsnotify.Event) {    fmt.Println("配置文件被修改:", e.Name)  })
  if err := viper.ReadInConfig(); err != nil {    panic(fmt.Errorf("配置文件读取失败: %s \n", err))  }
  // 读取配置项  username := viper.GetString("username")  password := viper.GetString("password")
  fmt.Printf("用户名: %s, 密码: %s\n", username, password)  select {}}


 

4. viper 高级功能

4.1 读取环境变量

Viper 可以直接读取环境变量


package main
import (  "fmt"  "github.com/spf13/viper")
func main() {  // 开启自动读取环境变量  viper.AutomaticEnv()   // 设置环境变量前缀,避免冲突  viper.SetEnvPrefix("MYAPP") 
  // 读取环境变量  username := viper.GetString("USERNAME")  password := viper.GetString("PASSWORD")
  fmt.Printf("用户名: %s, 密码: %s\n", username, password)}

4.2 绑定配置结构体

Viper 支持将配置信息直接绑定到 Go 结构体上,方便使用和管理配置项。


package main
import (  "fmt"  "github.com/spf13/viper")
type AppConfig struct {  Username string `mapstructure:"username"`  Password string `mapstructure:"password"`}
func main() {  viper.SetConfigFile("config.yaml")  if err := viper.ReadInConfig(); err != nil {    panic(fmt.Errorf("配置文件读取失败: %s \n", err))  }
  var config AppConfig  if err := viper.Unmarshal(&config); err != nil {    panic(fmt.Errorf("配置项绑定失败: %s \n", err))  }
  fmt.Printf("用户名: %s, 密码: %s\n",   config.Username, config.Password)}

4.3 设置默认值

Viper 允许为配置项设置默认值,确保即使配置文件中没有相关项,也能正常运行。


package main
import (  "fmt"  "github.com/spf13/viper")
func main() {  viper.SetDefault("username", "guest")  viper.SetDefault("password", "password123")
  viper.SetConfigFile("config.yaml")  if err := viper.ReadInConfig(); err != nil {    panic(fmt.Errorf("配置文件读取失败: %s \n", err))  }
  // 读取配置项  username := viper.GetString("username")  password := viper.GetString("password")
  fmt.Printf("用户名: %s, 密码: %s\n", username, password)}

4.4 别名映射

Viper 支持为配置项设置别名,使得可以使用不同名称的配置项进行访问。


package main
import (  "fmt"  "github.com/spf13/viper")
func main() {  viper.SetConfigFile("config.yaml")  if err := viper.ReadInConfig(); err != nil {    panic(fmt.Errorf("配置文件读取失败: %s \n", err))  }
  // 设置别名  viper.RegisterAlias("user", "username")
  // 读取配置项  username := viper.GetString("user")  password := viper.GetString("password")
  fmt.Printf("用户名: %s, 密码: %s\n", username, password)}


 

5. viper 实践

5.1 创建配置文件

创建一个名为config.yaml的配置文件,内容如下


username: adminpassword: admin123

5.2 定义配置结构体

在 Go 代码中定义一个与配置文件对应的结构体


package main
type AppConfig struct {  Username string `mapstructure:"username"`  Password string `mapstructure:"password"`}


package main
import (  "fmt"  "github.com/spf13/viper")
func main() {  viper.SetConfigFile("config.yaml")  if err := viper.ReadInConfig(); err != nil {    panic(fmt.Errorf("配置文件读取失败: %s \n", err))  }
  var config AppConfig  if err := viper.Unmarshal(&config); err != nil {    panic(fmt.Errorf("配置项绑定失败: %s \n", err))  }
  fmt.Printf("用户名: %s, 密码: %s\n",   config.Username, config.Password)}

5

package main
import (  "fmt"  "github.com/fsnotify/fsnotify"  "github.com/spf13/viper")
func main() {  viper.SetConfigFile("config.yaml")  viper.WatchConfig()  viper.OnConfigChange(func(e fsnotify.Event) {    fmt.Println("配置文件被修改:", e.Name)  })
  if err := viper.ReadInConfig(); err != nil {    panic(fmt.Errorf("配置文件读取失败: %s \n", err))  }
  var config AppConfig  if err := viper.Unmarshal(&config); err != nil {    panic(fmt.Errorf("配置项绑定失败: %s \n", err))  }
  fmt.Printf("用户名: %s, 密码: %s\n",   config.Username, config.Password)  select {}}


package main
import (  "fmt"  "github.com/spf13/viper")
type AppConfig struct {  Username string `mapstructure:"username"`  Password string `mapstructure:"password"`}
func main() {  viper.AutomaticEnv()  viper.SetEnvPrefix("MYAPP")
  var config AppConfig  if err := viper.Unmarshal(&config); err != nil {    panic(fmt.Errorf("配置项绑定失败: %s \n", err))  }
  fmt.Printf("用户名: %s, 密码: %s\n",   config.Username, config.Password)}


 

6. 总结

Viper 作为一个强大的配置管理库,具有以下主要优点:

灵活性:支持多种配置源和格式

易用性:简单而一致的 API 设计

扩展性:支持自定义配置解析器和格式

Viper 适用于任何需要在 Go 项目中管理配置的场景,特别是在需要支持多种配置源和格式的情况下,Viper 是一个不错的选择。

在实际项目中,使用 Viper 可以更方便地管理和维护配置信息,同时其丰富的功能使得在不同场景下的配置需求都能够得到满足。

通过本文的介绍,相信读者已经对 Viper 有了全面的了解,并能够在自己的 Go 项目中灵活应用。

目录
打赏
0
0
0
0
6
分享
相关文章
社区供稿 | 引入隐式模型融合技术,中山大学团队推出 FuseChat-3.0
在大语言模型(LLM)领域,结合多个模型的优势以提升单个模型的能力已成为一大趋势。然而,以往的模型融合方法例如 FuseLLM[1], FuseChat-1.0/2.0[2] 等存在词表对齐困难、效率低下等问题。
社区供稿 | 引入隐式模型融合技术,中山大学团队推出 FuseChat-3.0
《C 语言构建感知机:开启智能算法之门》
感知机算法是二分类问题的线性模型,通过调整权重和偏置项找到数据的分界线。本文探讨如何用高效、灵活的 C 语言实现感知机算法,包括数据处理、权重初始化、训练循环及收敛性检查等步骤,展示 C 语言在人工智能领域的独特魅力。
73 11
|
9月前
工程监测仪器的核心竞争力
工程监测仪器的核心竞争力主要包括以下几个方面: 1. 技术创新:工程监测仪器领域是一个高度技术密集型的行业,具备持续的技术创新能力是保持竞争优势的重要因素。具备自主研发能力,推出具有高精度、高稳定性、多功能的新产品和解决方案,能够满足客户的不同需求是核心竞争力的关键。
特定领域知识图谱(Domain-specific KnowledgeGraph:DKG)融合方案:技术知识前置【一】-文本匹配算法、知识融合学术界方案、知识融合业界落地方案、算法测评KG生产质量保障
本项目主要围绕着特定领域知识图谱(Domain-specific KnowledgeGraph:DKG)融合方案:技术知识前置【一】-文本匹配算法、知识融合学术界方案、知识融合业界落地方案、算法测评KG生产质量保障讲解了文本匹配算法的综述,从经典的传统模型到孪生神经网络“双塔模型”再到预训练模型以及有监督无监督联合模型,期间也涉及了近几年前沿的对比学习模型,之后提出了文本匹配技巧提升方案,最终给出了DKG的落地方案。这边主要以原理讲解和技术方案阐述为主,之后会慢慢把项目开源出来,一起共建KG,从知识抽取到知识融合、知识推理、质量评估等争取走通完整的流程。
特定领域知识图谱(Domain-specific KnowledgeGraph:DKG)融合方案:技术知识前置【一】-文本匹配算法、知识融合学术界方案、知识融合业界落地方案、算法测评KG生产质量保障
使用Rainbond打包业务模块,实现业务积木式拼装
每个程序员在学习开发的过程中,都知道解耦和模块化的重要性,也希望自己设计和开发的程序支持模块化,开发好的模块其他人就能快速复用,为了达成这个效果,我们学习各种模块化和解耦的技术,从面向对象的设计模式到微服务架构,近几年大家觉得微服务架构是模块化的银弹,都朝微服务架构改造,但实际效果不仅没有很好模块化,反而陷入应用部署和运维的泥潭里。本文将讲讲Rainbond解决应用架构解耦和模块化的一些新思路。
使用Rainbond打包业务模块,实现业务积木式拼装
对新思路项目的一些思考和总结
## 背景 新丝路项目由促销、交易团队发起,目标面向底层电商链路引入集团的业务中台,以此增加考拉的整体电商能力,并提高后续的整体开发效率。 从今年3月初开始产品设计,4月底开始正式开发,涉及到供应链、菜鸟、业务中台、考拉四个BG的项目历时半年终于正式发布上线。这是一个及其庞大且复杂的项目,在项目过程中遇到了种种问题值得反思和总结。 ## 关于项目管理 整体项目节奏大概是315~420产品方案和
443 0
迈出工程开放的第一步,DEF工程微平台体系升级之路
DEF 研发平台从 18 年 7 月由原有淘系的发布流程引擎平台 升级建设之后,服役到目前已经是第三个年头了。目前以各种形式服务着淘系及集团大多数前端研发、部署的流程。随着平台的维护和发展,也遇到了一些业务上的困境和挑战。
迈出工程开放的第一步,DEF工程微平台体系升级之路
视觉生产技术入门篇
视觉生产技术入门学习,什么是视觉生产?视觉生产分割抠图、视觉生成、视觉编辑、视觉增强、视觉制造等。
1371 0
视觉生产技术入门篇
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等