本文主要是介绍Golang-Viper读取配置文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
为什么需要配置文件
- 代码可维护性
- 不用修改配置重启服务
安装
go get -u github.com/spf13/viper
代码示例
结构体Server配置
type Server struct {JWT JWT `mapstructure:"jwt" json:"jwt" yaml:"jwt"`Redis Redis `mapstructure:"redis" json:"redis" yaml:"redis"`Email Email `mapstructure:"email" json:"email" yaml:"email"`Captcha Captcha `mapstructure:"captcha" json:"captcha" yaml:"captcha"`// gormMysql Mysql `mapstructure:"mysql" json:"mysql" yaml:"mysql"`// ossTencentCOS TencentCOS `mapstructure:"tencent-cos" json:"tencent-cos" yaml:"tencent-cos"`// 跨域配置Cors CORS `mapstructure:"cors" json:"cors" yaml:"cors"`
}
JWT
type JWT struct {SigningKey string `mapstructure:"signing-key" json:"signing-key" yaml:"signing-key"` // jwt签名ExpiresTime string `mapstructure:"expires-time" json:"expires-time" yaml:"expires-time"` // 过期时间BufferTime string `mapstructure:"buffer-time" json:"buffer-time" yaml:"buffer-time"` // 缓冲时间Issuer string `mapstructure:"issuer" json:"issuer" yaml:"issuer"` // 签发者
}
Redis
type Redis struct {Addr string `mapstructure:"addr" json:"addr" yaml:"addr"` // 服务器地址:端口Password string `mapstructure:"password" json:"password" yaml:"password"` // 密码DB int `mapstructure:"db" json:"db" yaml:"db"` // redis的哪个数据库
}
邮箱配置
type Email struct {To string `mapstructure:"to" json:"to" yaml:"to"` // 收件人:多个以英文逗号分隔 例:a@qq.com b@qq.com 正式开发中请把此项目作为参数使用From string `mapstructure:"from" json:"from" yaml:"from"` // 发件人 你自己要发邮件的邮箱Host string `mapstructure:"host" json:"host" yaml:"host"` // 服务器地址 例如 smtp.qq.com 请前往QQ或者你要发邮件的邮箱查看其smtp协议Secret string `mapstructure:"secret" json:"secret" yaml:"secret"` // 密钥 用于登录的密钥 最好不要用邮箱密码 去邮箱smtp申请一个用于登录的密钥Nickname string `mapstructure:"nickname" json:"nickname" yaml:"nickname"` // 昵称 发件人昵称 通常为自己的邮箱Port int `mapstructure:"port" json:"port" yaml:"port"` // 端口 请前往QQ或者你要发邮件的邮箱查看其smtp协议 大多为 465IsSSL bool `mapstructure:"is-ssl" json:"is-ssl" yaml:"is-ssl"` // 是否SSL 是否开启SSL
}
验证码配置
type Captcha struct {KeyLong int `mapstructure:"key-long" json:"key-long" yaml:"key-long"` // 验证码长度ImgWidth int `mapstructure:"img-width" json:"img-width" yaml:"img-width"` // 验证码宽度ImgHeight int `mapstructure:"img-height" json:"img-height" yaml:"img-height"` // 验证码高度OpenCaptcha int `mapstructure:"open-captcha" json:"open-captcha" yaml:"open-captcha"` // 防爆破验证码开启此数,0代表每次登录都需要验证码,其他数字代表错误密码此数,如3代表错误三次后出现验证码OpenCaptchaTimeOut int `mapstructure:"open-captcha-timeout" json:"open-captcha-timeout" yaml:"open-captcha-timeout"` // 防爆破验证码超时时间,单位:s(秒)
}
数据库配置
type Mysql struct {Prefix string `mapstructure:"prefix" json:"prefix" yaml:"prefix"`Port string `mapstructure:"port" json:"port" yaml:"port"`Config string `mapstructure:"config" json:"config" yaml:"config"` // 高级配置Dbname string `mapstructure:"db-name" json:"db-name" yaml:"db-name"` // 数据库名Username string `mapstructure:"username" json:"username" yaml:"username"` // 数据库密码Password string `mapstructure:"password" json:"password" yaml:"password"` // 数据库密码Path string `mapstructure:"path" json:"path" yaml:"path"`Engine string `mapstructure:"engine" json:"engine" yaml:"engine" default:"InnoDB"` //数据库引擎,默认InnoDBLogMode string `mapstructure:"log-mode" json:"log-mode" yaml:"log-mode"` // 是否开启Gorm全局日志MaxIdleConns int `mapstructure:"max-idle-conns" json:"max-idle-conns" yaml:"max-idle-conns"` // 空闲中的最大连接数MaxOpenConns int `mapstructure:"max-open-conns" json:"max-open-conns" yaml:"max-open-conns"` // 打开到数据库的最大连接数Singular bool `mapstructure:"singular" json:"singular" yaml:"singular"` //是否开启全局禁用复数,true表示开启LogZap bool `mapstructure:"log-zap" json:"log-zap" yaml:"log-zap"`
}
func (m *Mysql) Dsn() string {return m.Username + ":" + m.Password + "@tcp(" + m.Path + ":" + m.Port + ")/" + m.Dbname + "?" + m.Config
}func (m *Mysql) GetLogMode() string {return m.LogMode
}
COS云对象存储配置
type TencentCOS struct {Bucket string `mapstructure:"bucket" json:"bucket" yaml:"bucket"`Region string `mapstructure:"region" json:"region" yaml:"region"`SecretID string `mapstructure:"secret-id" json:"secret-id" yaml:"secret-id"`SecretKey string `mapstructure:"secret-key" json:"secret-key" yaml:"secret-key"`BaseURL string `mapstructure:"base-url" json:"base-url" yaml:"base-url"`PathPrefix string `mapstructure:"path-prefix" json:"path-prefix" yaml:"path-prefix"`
}
type CORS struct {Mode string `mapstructure:"mode" json:"mode" yaml:"mode"`Whitelist []CORSWhitelist `mapstructure:"whitelist" json:"whitelist" yaml:"whitelist"`
}
跨域配置
type CORSWhitelist struct {AllowOrigin string `mapstructure:"allow-origin" json:"allow-origin" yaml:"allow-origin"`AllowMethods string `mapstructure:"allow-methods" json:"allow-methods" yaml:"allow-methods"`AllowHeaders string `mapstructure:"allow-headers" json:"allow-headers" yaml:"allow-headers"`ExposeHeaders string `mapstructure:"expose-headers" json:"expose-headers" yaml:"expose-headers"`AllowCredentials bool `mapstructure:"allow-credentials" json:"allow-credentials" yaml:"allow-credentials"`
}
Viper读取yaml配置文件
const (ConfigEnv = "GVA_CONFIG"ConfigDefaultFile = "config.yaml"ConfigTestFile = "config.test.yaml"ConfigDebugFile = "config.debug.yaml"ConfigReleaseFile = "config.release.yaml"
)
func Viper(path ...string) *viper.Viper {var configFile stringif len(path) == 0 {flag.StringVar(&configFile, "c", "", "choose config file.")flag.Parse()if configFile == "" { // 判断命令行参数是否为空switch gin.Mode() {case gin.DebugMode:configFile = ConfigDefaultFilefmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.Mode())case gin.ReleaseMode:configFile = ConfigReleaseFilefmt.Printf("您正在使用gin模式的%s环境名称,config的路径为", gin.Mode())case gin.TestMode:configFile = ConfigTestFilefmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.Mode())}} else { // 命令行参数不为空 将值赋值于configfmt.Printf("您正在使用命令行的-c参数传递的值,config的路径为%s\n", configFile)}} else { // 函数传递的可变参数的第一个值赋值于configconfigFile = path[0]fmt.Printf("您正在使用func Viper()传递的值,config的路径为%s\n", configFile)}// 初始化Viper對象v := viper.New()// 设置配置文件的路径v.SetConfigFile(configFile)// 配置文件类型v.SetConfigType("yaml")err := v.ReadInConfig()if err != nil {panic(fmt.Errorf("Fatal error config file: %s \n", err))}// 配置文件变动会重读不必重启服务v.WatchConfig()// 当配置文件变化调用此hook 确保在调用之前添加所有 configPathv.OnConfigChange(func(e fsnotify.Event) {fmt.Println("config file changed:", e.Name)if err = v.Unmarshal(&GVA_CONFIG); err != nil {fmt.Println(err)}})if err = v.Unmarshal(&GVA_CONFIG); err != nil {panic(err)}return v
}
// 在其他文件中
v := cofnig.Viper()
v.get("mysql")
这篇关于Golang-Viper读取配置文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!