Golang工具库viper的使用教程

 更新时间:2023年07月21日 14:25:54   作者:uccs  
viper 是 go 项目中用来读取配置文件的库,支持读取 yaml、toml、json、hcl、env 等格式的配置文件,下面就来和大家聊聊它的具体使用吧

vipergo 项目中用来读取配置文件的库,支持读取 yamltomljsonhclenv 等格式的配置文件

读取环境变量

viper 可以读取终端的环境变量

如果你用的是 zsh~/.zshrc 中设置,如果是 bash~/.bashrc 中设置

写环境变量时,等号两边不能有空格,否则会报错

export APP_DEBUG=true

写好后,记得 source 一下,或者重启终端

source ~/.zshrc

使用 viper.AutomaticEnv 将环境变量都读取到 viper

然后就可以使用 viper.GetBool("APP_DEBUG") 来获取环境变量了

func GetEnvInfo(env string) bool {
	viper.AutomaticEnv()
	return viper.GetBool(env)
}
app_debug := GetEnvInfo("APP_DEBUG")
fmt.Println(app_debug) // true

读取本地的配置文件

新建一个 config-debug.yaml 文件,内容如下:

host: "127.0.0.1"
port: 50051

然后使用 viper 读取,setConfigFile 填写的路径是相对于 main.go 的路径

使用 viper.ReadInConfig 来读取配置文件

viper.SetConfigFile("./config-debug.yaml")
if err := viper.ReadInConfig(); err != nil {
  panic(err)
}
fmt.Println(viper.GetString("host")) // "127.0.0.1"

使用 viper.SetConfigName 来设置文件名,viper.SetConfigType 来设置文件类型,可以更灵活的读取配置文件

  • viper.SetConfigName 设置文件名,不需要带后缀
  • viper.SetConfigType 设置文件类型
  • viper.AddConfigPath 设置文件路径
viper.SetConfigName("config-debug")
viper.SetConfigType("yaml")
viper.AddConfigPath("./")
if err := viper.ReadInConfig(); err != nil {
  panic(err)
}
fmt.Println(viper.GetString("host")) // "127.0.0.1"

将配置文件中的配置映射到结构体中

每次使用 viper.GetString 来获取配置文件中的配置,都会写很多重复的代码,可以将配置文件中的配置映射到结构体中

新建结构体,结构体的字段名要和配置文件中的字段名一致,使用 mapstructure 标签来映射

type Server struct {
  Host string `mapstructure:"host"`
  Port int    `mapstructure:"port"`
}

使用 viper.Unmarshal 将配置文件中的配置映射到结构体中

var server Server
viper.SetConfigName("config-debug")
viper.SetConfigType("yaml")
viper.AddConfigPath("./")
if err := viper.ReadInConfig(); err != nil {
  panic(err)
}
if err := viper.Unmarshal(&server); err != nil {
	panic(err)
}
fmt.Println(server.Host) // "127.0.0.1"

监听配置信息的变化

如果配置文件发生变化,viper 支持在运行时监听配置文件的变化

使用 viper.WatchConfig 来监听配置文件的变化,使用 viper.OnConfigChange 来监听配置文件的变化

onConfigChange 传入的参数是一个函数,函数的参数是 fsnotify.Event,在函数中重新读取配置文件,然后将配置文件中的配置映射到结构体中

viper.OnConfigChange(func(e fsnotify.Event) {
  _ = viper.ReadInConfig()
  _ = viper.Unmarshal(&server)
})
viper.WatchConfig()

到此这篇关于Golang工具库viper的使用教程的文章就介绍到这了,更多相关Golang viper内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 从并发到并行解析Go语言中的sync.WaitGroup

    从并发到并行解析Go语言中的sync.WaitGroup

    Go 语言提供了许多工具和机制来实现并发编程,其中之一就是 sync.WaitGroup。本文就来深入讨论 sync.WaitGroup,探索其工作原理和在实际应用中的使用方法吧
    2023-05-05
  • Go WaitGroup及Cond底层实现原理

    Go WaitGroup及Cond底层实现原理

    这篇文章主要为大家介绍了Go WaitGroup及Cond底层实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • golang编程开发使用sort排序示例详解

    golang编程开发使用sort排序示例详解

    这篇文章主要为大家介绍了go语言编程开发使用sort来排序示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • Golang使用pprof和trace进行诊断和修复性能问题

    Golang使用pprof和trace进行诊断和修复性能问题

    在 Go 中,开发人员可以使用强大的内置工具来帮助诊断和修复性能问题,其中两个工具是 pprof 和 trace 包,下面就跟随小编一起来了解下如何使用pprof和trace进行诊断和修复性能问题吧
    2024-01-01
  • Go如何优雅的使用字节池示例详解

    Go如何优雅的使用字节池示例详解

    在编程开发中,我们经常会需要频繁创建和销毁同类对象的情形,这样的操作很可能会对性能造成影响,这时常用的优化手段就是使用对象池(object pool),这篇文章主要给大家介绍了关于Go如何优雅的使用字节池的相关资料,需要的朋友可以参考下
    2022-08-08
  • Golang使用elastic库来实现前后端模糊搜索功能

    Golang使用elastic库来实现前后端模糊搜索功能

    这篇文章主要为大家详细介绍了如何使用Golang和TypeScript的elastic库来实现前端和后端交互的模糊搜索功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-11-11
  • Golang交叉编译(跨平台编译)的使用

    Golang交叉编译(跨平台编译)的使用

    本文主要介绍了Golang交叉编译(跨平台编译)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Golang中for循环的用法示例详解

    Golang中for循环的用法示例详解

    for循环就是让一段代码循环的执行,接下来通过本文给大家讲解Golang中for循环的用法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Go语言MD5加密用法实例

    Go语言MD5加密用法实例

    这篇文章主要介绍了Go语言MD5加密用法,实例分析了Go语言MD5加密的使用技巧,需要的朋友可以参考下
    2015-03-03
  • Golang map实现原理浅析

    Golang map实现原理浅析

    Go中Map是一个KV对集合,下面这篇文章主要给大家介绍了关于Golang中map探究的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-12-12

最新评论