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

news2025/1/7 0:23:12

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: 8080
  host: "localhost"

使用 Viper 读取配置:

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

import (
    "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 main

import (
    "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 Config
    if 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 main

import (
    "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.coloradmin.cn/o/2271445.html

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

相关文章

NCCL源码解读3.1:double binary tree双二叉树构建算法,相比ring环算法的优势

目录 一、双二叉树出现的原因 二、双二叉树介绍 三、双二叉树大规模性能 四、双二叉树源码解读 双二叉树注意事项 核心逻辑 源码速递 视频分享在这,未完待补充: 3.1 NCCL源码解读双二叉树构建算法,double binary tree相比ring环算法的…

Linux部署web项目【保姆级别详解,Ubuntu,mysql8.0,tomcat9,jdk8 附有图文】

文章目录 部署项目一.安装jdk1.1 官网下载jdk81.2 上传到Linux1.3 解压1.4 配置环境变量1.5 查看是jdk是否安装成功 二.安装TomCat2.1 官网下载2.2 上传到Linux2.3 解压2.4配置2.5 启动Tomcat2.6 验证是否成功 三.安装mysql四.部署javaweb项目4.1 打包4.2 启动tomcat 部署项目 …

unity中的UI系统---GUI

一、工作原理和主要作用 1.GUI是什么? 即即时模式游戏用户交互界面(IMGUI),在unity中一般简称为GUI,它是一个代码驱动的UI系统。 2.GUI的主要作用 2.1作为程序员的调试工具,创建游戏内调测试工具 2.2为…

MySQL 【多表查询】

一 . 概述 多表关系: 一对多(多对一) , 多对多 ,一对一 1) 一对一 案例: 用户 与 用户详情的关系 关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另 一张表…

【大模型】ChatGPT 数据分析与处理使用详解

目录 一、前言 二、AI 大模型数据分析介绍 2.1 什么是AI数据分析 2.2 AI数据分析与传统数据分析对比 2.2.1 差异分析 2.2.2 优劣势对比 2.3 AI大模型工具数据分析应用场景 三、AI大模型工具数据分析操作实践 3.1 ChatGPT 常用数据分析技巧操作演示 3.1.1 快速生成数据…

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot,对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解; 面试题 Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?Spring Boot的自动配置原理是什么?你如何理解 Spring Boot 配置…

【Java项目】基于SpringBoot的【新生宿舍管理系统】

【Java项目】基于SpringBoot的【新生宿舍管理系统】 技术简介:本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介:管理员登录进入新生宿舍管理系统可以查看首页、个人中心、公告信息管理、院系管理、班级管理、学生管理、宿舍…

【AI学习】Transformer深入学习(二):从MHA、MQA、GQA到MLA

前面文章: 《Transformer深入学习(一):Sinusoidal位置编码的精妙》 一、MHA、MQA、GQA 为了降低KV cache,MQA、GQA作为MHA的变体,很容易理解。 多头注意力(MHA): 多头注…

IP5385应用于移动电源快充方案的30W到100W大功率电源管理芯片

英集芯IP5385一款专为智能手机,平板,移动电源,手持电动工具等便携式电子设备提供快充解决方案的30W到100W大功率电源管理SOC芯片。集成了快充协议芯片、MCU、同步升降压控制器等多种功能于一个封装内部,有效减小了整体方案的尺寸。…

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论? 请挑一项信息技术,谈一谈为什么认为他是道德的/不道德的,或者根据使用场景才能判断是否道德。判断的依据是什么(自身的道德准则)?为什么你觉得你的道德准则是合理的,其他…

.Net加密与Java互通

.Net加密与Java互通 文章目录 .Net加密与Java互通前言RSA生成私钥和公钥.net加密出数据传给Java端采用java方给出的公钥进行加密采用java方给出的私钥进行解密 .net 解密来自Java端的数据 AES带有向量的AES加密带有向量的AES解密无向量AES加密无向量AES解密 SM2(国密)SM2加密Sm…

西安电子科技大学初/复试笔试、面试、机试成绩占比

西安电子科技大学初/复试笔试、面试、机试成绩占比 01通信工程学院 02电子工程学院 03计算机科学与技术学院 04机电工程学院 06经济与管理学院 07数学与统计学院 08人文学院 09外国语学院 12生命科学与技术学院 13空间科学与技术学院 14先进材料与纳米科技学院 15网络与信息安…

服务器信息整理

文章目录 引言I BIOS时间Windows查看BIOS版本安装日期linux查看BIOS时间II 操作系统安装日期LinuxIII MAC 地址IV 设备序列号Linux 查看主板信息引言 信息内容:重点信息:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统 Linux查看工具:ifconfig、宝塔运维…

关于PINN进一步的探讨

pinn 是有监督、无监督、半监督? PINN(Physics-Informed Neural Networks,物理信息神经网络)通常被归类为一种有监督学习的方法。在PINN中,神经网络的训练过程不仅依赖于数据点(例如实验观测数据&#xff0…

Linux-Ubuntu之I2C通信

Linux-Ubuntu之I2C通信 一,I2C通信原理1.写时序2.读时序 二,代码实现三,显示 一,I2C通信原理 使用I2C接口驱动AP3216C传感器,该传感器能实现两个效果,一个是感应光强,另一个是探测物体与传感器…

Trimble天宝X9三维扫描仪为建筑外墙检测提供了全新的解决方案【沪敖3D】

随着城市化进程的快速推进,城市高层建筑不断增多,对建筑质量的要求也在不断提高。建筑外墙检测,如平整度和垂直度检测,是衡量建筑质量的重要指标之一。传统人工检测方法不仅操作繁琐、效率低下,还难以全面反映墙体的真…

主机A与主机B建立TCP连接的三次握手过程

( 1 )主机 A 的 TCP 向主机 B 发出连接请求 SYN 报文段(第一次握手)。( 1 分) ( 2 )一旦包含 SYN 报文段的 IP 数据报到达主机 B , SYN 报文段被从数据报…

【GUI-pyqt5】QObject类

1. QObject模块详解 1.1 描述 所有Qt对象的父类 1.2 功能和作用 1.2.1 对象名称和属性 1.2.1.1 API API功能备注 setObjectName("唯一名称") 给一个Qt对象设置一个名称 一般这个名称是唯一的,当做对象ID来使用 objectName() 获取一个对象名称 - set…

C++Primer 变量

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

VScode怎么重启

原文链接:【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行,如下图: 输入Reload Window,如下图: