1. 介绍

Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:

  • 设置默认值
  • JSONTOMLYAMLHCLenvfileJava properties格式的配置文件读取配置信息
  • 实时监控和重新读取配置文件(可选)
  • 从环境变量中读取
  • 从远程配置系统(etcd或Consul)读取并监控配置变化
  • 从命令行参数读取配置
  • 从buffer读取配置
  • 显式配置值

2. yaml教程

教程地址

3. 安装

viper项目地址

  1. go get github.com/spf13/viper

4. 将配置文件映射成struct

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/spf13/viper"
  5. )
  6. type ServerConfig struct{
  7. ServiceName string `mapstructure:"name"`
  8. Port int `mapstructure:"port"`
  9. }
  10. func main(){
  11. v := viper.New()
  12. //文件的路径如何设置
  13. v.SetConfigFile("viper_test/ch01/config.yaml")
  14. if err := v.ReadInConfig(); err != nil{
  15. panic(err)
  16. }
  17. serverConfig := ServerConfig{}
  18. if err := v.Unmarshal(&serverConfig); err != nil{
  19. panic(err)
  20. }
  21. fmt.Println(serverConfig)
  22. fmt.Printf("%V", v.Get("name"))
  23. }

配置文件config.yaml

  1. name: 'user-web'
  2. port: 8021

5. 使用

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/fsnotify/fsnotify"
  5. "github.com/spf13/viper"
  6. "time"
  7. )
  8. type MysqlConfig struct {
  9. Host string `mapstructure:"host"`
  10. Port int `mapstructure:"port"`
  11. }
  12. type ServerConfig struct{
  13. Name string `mapstructure:"name"`
  14. MysqlInfo MysqlConfig `mapstructure:"mysql"`
  15. }
  16. func GetEnvInfo(env string) string {
  17. viper.AutomaticEnv()
  18. return viper.GetString(env)
  19. }
  20. func main(){
  21. data := GetEnvInfo("Debug")
  22. var configFileName string
  23. configFileNamePrefix := "config"
  24. if data == "true" {
  25. configFileName = fmt.Sprintf("viper_test/%s-debug.yaml", configFileNamePrefix)
  26. }else{
  27. configFileName = fmt.Sprintf("viper_test/%s-pro.yaml", configFileNamePrefix)
  28. }
  29. serverConfig := ServerConfig{}
  30. fmt.Println(data)
  31. v := viper.New()
  32. v.SetConfigFile(configFileName)
  33. err := v.ReadInConfig()
  34. if err != nil {
  35. panic(err)
  36. }
  37. if err := v.Unmarshal(&serverConfig); err != nil {
  38. panic(err)
  39. }
  40. fmt.Println(serverConfig)
  41. go func() {
  42. v.WatchConfig()
  43. v.OnConfigChange(func(e fsnotify.Event) {
  44. fmt.Println("Config file changed:", e.Name)
  45. _ = v.ReadInConfig() // 读取配置数据
  46. _ = v.Unmarshal(&serverConfig)
  47. fmt.Println(serverConfig)
  48. })
  49. }()
  50. time.Sleep(time.Second*3000)
  51. }

配置文件内容

  1. name: 'user-web'
  2. mysql:
  3. host: '127.0.0.1'
  4. port: 3306

手机号码正则表达式

  1. ^1([38][0-9]|14[579]|5[^4]|16[6]|7[1-35-8]|9[189])\d{8}$