Golang viper包环境变量采坑指南(viper时间读取)

发布时间: 2021-02-20 更新时间: 2022-01-20

Golang Golang,viper,时间读取 4.10 K 3 分钟 622

Golang viper包环境变量采坑指南(viper时间读取)

一、起因

~~前面采坑了关于docker部署,环境变量读取的问题。最近又遇见另外一个坑。viper读取时间的方式。文件目录如下:

__
  |--conf.yaml
  |--go.mod
  |--main.go

安装viper:go get github.com/spf13/viper

二、简化代码

  1. main.go
package main import ( "github.com/spf13/pflag" "github.com/spf13/viper" "log" "os" "os/signal" "syscall" "time" ) var ( cfg = pflag.StringP("config", "c", "", "配置文件路径") ) type Config struct { AppMode string PageSize int JwtExpireTime time.Duration } var Conf = &Config{} func main() { pflag.Parse() if *cfg != "" { viper.SetConfigFile(*cfg) // 如果指定了配置文件,则解析指定的配置文件 } else { viper.AddConfigPath(".") // 查找配置文件所在路径 viper.SetConfigName("conf") // 配置文件的文件名,没有扩展名,如 .yaml, .toml 这样的扩展名 } viper.SetConfigType("yaml") // 设置扩展名。在这里设置文件的扩展名。 viper.AutomaticEnv() err := viper.ReadInConfig() // 搜索并读取配置文件 if err != nil { // 处理错误 panic(err) } err = viper.Unmarshal(Conf) if err != nil { panic(err) } Conf.JwtExpireTime = Conf.JwtExpireTime * time.Hour log.Printf("PageSize:%d \n", Conf.PageSize) log.Printf("AppMode:%s \n", Conf.AppMode) log.Printf("JwtExpireTime:%v \n", Conf.JwtExpireTime) quit := make(chan os.Signal) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit }
  1. conf.yaml
AppMode: debug PageSize: 10 JwtExpireTime: 3

三、测试(windows)

  1. 未设置环境变量,直接读取conf文件内容。执行go run main.go
2021/02/20 18:31:03 PageSize:10 
2021/02/20 18:31:03 AppMode:debug 
2021/02/20 18:31:03 JwtExpireTime:30h0m0s 

可以正常读取到时间内容

  1. 设置JwtExpireTime环境变量,set JwtExpireTime=10
panic: 1 error(s) decoding:

* error decoding 'JwtExpireTime': time: missing unit in duration "10"

JwtExpireTime报错,无法读取到内容

四、解决方法

经过查阅viper.GetDuration()代码内容,只要是time.ParseDuration能解析的内容,都可以自动转换为对应的数据内容,例如3s、2m、1m30s、1h等。包含有nsuµmh的字符都能解析。

  1. 修改conf.yaml
AppMode: debug PageSize: 10 JwtExpireTime: 3h # 此处修改还有时间单位的值
  1. 修改main.go
package main import ( "github.com/spf13/pflag" "github.com/spf13/viper" "log" "os" "os/signal" "syscall" "time" ) var ( cfg = pflag.StringP("config", "c", "", "配置文件路径") ) type Config struct { AppMode string PageSize int JwtExpireTime time.Duration } var Conf = &Config{} func main() { pflag.Parse() if *cfg != "" { viper.SetConfigFile(*cfg) // 如果指定了配置文件,则解析指定的配置文件 } else { viper.AddConfigPath(".") // 查找配置文件所在路径 viper.SetConfigName("conf") // 配置文件的文件名,没有扩展名,如 .yaml, .toml 这样的扩展名 } viper.SetConfigType("yaml") // 设置扩展名。在这里设置文件的扩展名。 viper.AutomaticEnv() err := viper.ReadInConfig() // 搜索并读取配置文件 if err != nil { // 处理错误 panic(err) } err = viper.Unmarshal(Conf) if err != nil { panic(err) } // Conf.JwtExpireTime = Conf.JwtExpireTime * time.Hour 删除此处 log.Printf("PageSize:%d \n", Conf.PageSize) log.Printf("AppMode:%s \n", Conf.AppMode) log.Printf("JwtExpireTime:%v \n", Conf.JwtExpireTime) quit := make(chan os.Signal) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit }
  1. 设置JwtExpireTime环境变量,set JwtExpireTime=10h,加上时间单位。
2021/02/20 18:55:58 PageSize:10
2021/02/20 18:55:58 AppMode:debug
2021/02/20 18:55:58 JwtExpireTime:10h0m0s

五、总结

  • 使用配置文件时,需要带上时间单位nsuµmh
  • 使用环境变量时,需要带上时间单位nsuµmh
end
如果你觉得还不错的话,请我吃个午饭吧!😍
支付宝
支付宝
微信
微信
目录

Copyright © 2019-2020 qzq版权所有

蜀ICP备19012274号-1 | 管理