Skip to content

1. 介绍

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

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

2. yaml教程

教程地址

3. 安装

viper项目地址

go
go get github.com/spf13/viper

4. 将配置文件映射成struct

go
package main

import (
	"fmt"
	"github.com/spf13/viper"
)

type ServerConfig struct{
	ServiceName string `mapstructure:"name"`
	Port int `mapstructure:"port"`
}

func main(){
	v := viper.New()
	//文件的路径如何设置
	v.SetConfigFile("viper_test/ch01/config.yaml")
	if err := v.ReadInConfig(); err != nil{
		panic(err)
	}
	serverConfig := ServerConfig{}
	if err := v.Unmarshal(&serverConfig); err != nil{
		panic(err)
	}
	fmt.Println(serverConfig)
	fmt.Printf("%V", v.Get("name"))
}

配置文件config.yaml

yaml
name: 'user-web'
port: 8021

5. 使用

go
package main

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"time"
)

type MysqlConfig struct {
	Host string `mapstructure:"host"`
	Port int `mapstructure:"port"`
}
type ServerConfig struct{
	Name string `mapstructure:"name"`
	MysqlInfo MysqlConfig `mapstructure:"mysql"`
}

func GetEnvInfo(env string) string {
	viper.AutomaticEnv()
	return viper.GetString(env)
}

func main(){
	data := GetEnvInfo("Debug")
	var configFileName string
	configFileNamePrefix := "config"
	if data == "true" {
		configFileName = fmt.Sprintf("viper_test/%s-debug.yaml", configFileNamePrefix)
	}else{
		configFileName = fmt.Sprintf("viper_test/%s-pro.yaml", configFileNamePrefix)
	}

	serverConfig := ServerConfig{}

	fmt.Println(data)

	v := viper.New()
	v.SetConfigFile(configFileName)
	err := v.ReadInConfig()
	if err != nil {
		panic(err)
	}
	if err := v.Unmarshal(&serverConfig); err != nil {
		panic(err)
	}
	fmt.Println(serverConfig)

	go func() {
		v.WatchConfig()
		v.OnConfigChange(func(e fsnotify.Event) {
			fmt.Println("Config file changed:", e.Name)
			_ = v.ReadInConfig() // 读取配置数据
			_ = v.Unmarshal(&serverConfig)
			fmt.Println(serverConfig)
		})
	}()
	
	time.Sleep(time.Second*3000)

}

配置文件内容

yaml
name: 'user-web'
mysql:
  host: '127.0.0.1'
  port: 3306

手机号码正则表达式

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