1. 使用库viper
使用示例
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{}
//映射给struct
if err := v.Unmarshal(&serverConfig); err != nil {
panic(err)
}
fmt.Println(serverConfig)
fmt.Println(serverConfig.ServiceName)
fmt.Printf("%V", v.Get("name"))
}
yaml配置
name: 'user-web'
mysql:
host: '127.0.0.1'
port: 3306
2. 如何将线上和线下的配置文件隔离
需求:
//如何将线上和线下的配置文件隔离
//不用改任何代码而且线上和线上的配置文件能隔离开
实现:定义环境GetEnvInfo,通过定义环境变量来实现
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 {
ServiceName string `mapstructure:"name"`
MysqlInfo MysqlConfig `mapstructure:"mysql"`
}
func GetEnvInfo(env string) bool {
viper.AutomaticEnv()
return viper.GetBool(env)
//刚才设置的环境变量 想要生效 我们必须得重启goland
}
func main() {
fmt.Println(GetEnvInfo("MXSHOP_DEBUG"))
//配置环境变量
debug := GetEnvInfo("MXSHOP_DEBUG")
configFilePrefix := "config"
configFileName := fmt.Sprintf("viper_test/ch02/%s-pro.yaml", configFilePrefix)
if debug {
configFileName = fmt.Sprintf("viper_test/ch02/%s-debug.yaml", configFilePrefix)
}
v := viper.New()
//文件的路径如何设置
v.SetConfigFile(configFileName)
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"))
//viper的功能 - 动态监控变化
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("config file channed: ", e.Name)
_ = v.ReadInConfig()
_ = v.Unmarshal(&serverConfig)
fmt.Println(serverConfig)
})
time.Sleep(time.Second * 300)
}