使用Viper+fsnotify实现
package bootstrap
import (
"fmt"
"log"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
// 配置信息结构
type Config struct {
Server struct {
Version string `mapstructure:"VERSION"`
Debug bool `mapstructure:"DEBUG"`
Port string `mapstructure:"PORT"`
}
}
// 配置初始化
func InitConfig() error {
var cfg Config
serverConfig = &cfg
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath("./config")
viper.AutomaticEnv()
if err := viper.ReadInConfig(); err != nil {
return fmt.Errorf("加载配置文件失败: %w", err)
}
if err := viper.Unmarshal(&cfg); err != nil {
return fmt.Errorf("解析配置文件失败: %w", err)
}
// 热重载
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
if err := viper.Unmarshal(&cfg); err != nil {
log.Printf("配置文件重新加载失败: %s", err)
return
}
serverConfig = &cfg
})
return nil
}