问题:修改了一次,而执行了两次这个函数
解决方案
把配置文件进行md5,保存其md5值。在调用这个函数时,再次读取文件进行md5。两者比对,如果相等就不执行下面的逻辑。
这样就解决了,一模一样的配置文件,保存多次,不会执行后续的逻辑。
但是,杜绝了大部分的场景,比如修改了一次,保存了两次,依旧会有看起来一模一样的配置,md5值不同
// GetMD5 获取byte对应MD5 func GetMD5(s []byte) string { m := md5.New() m.Write([]byte(s)) return hex.EncodeToString(m.Sum(nil)) } // 获取文件byte func ReadFileMd5(sfile string) (string, error) { ssconfig, err := os.ReadFile(sfile) if err != nil { return "", err } return GetMD5(ssconfig), nil } func Init() { // 设置配置文件路径 filepath := "xxxx" viper.SetConfigFile(filepath) // 获取文件MD5 confMD5, err := ReadFileMd5(filepath) if err != nil { log.Fatal(err) } // 读取配置文件 if err := viper.ReadInConfig(); err != nil { log.Fatal(err) } // 设置监控文件 viper.WatchConfig() // 设置配置文件修改回调 viper.OnConfigChange(func(e fsnotify.Event) { // 配置文件发生变更之后会调用的回调函数 tconfMD5, err := ReadFileMd5(filepath) if err != nil { logger.Fatal(err) } // 比对当前MD5与之前是否相同 if tconfMD5 == confMD5 { return } // 这说明文件发生了改变. confMD5 = tconfMD5 log.Println("Config file changed!") }) }
标签:err,nil,OnConfigChange,Golang,viper,byte,md5,配置文件 From: https://www.cnblogs.com/beatleC/p/17418010.html