首页 > 其他分享 >Golang的viper包调用多次OnConfigChange

Golang的viper包调用多次OnConfigChange

时间:2023-05-20 23:22:40浏览次数:44  
标签:err nil OnConfigChange Golang viper byte md5 配置文件

问题:修改了一次,而执行了两次这个函数

解决方案

把配置文件进行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

相关文章

  • golang操作redis
    首先,基于docker查看redis镜像dockerps-a然后执行dockerrun-p6379:6379-dredis:latestredis-server,将端口映射到本机最后执行dockerexec-ti13e638ea1036redis-cli-h0.0.0.0-p6379执行链接操作......
  • golang采坑
    2023年4月8日12:00:28选择golang开发的几个理由语法简单,类C语法,但是又不是全c风格,刚开始会有些不适应部署简单,直接编译成二进制文件,直接部署高性能,很多互联网项目需要考虑的近些年,go的社区基金会都是大厂,未来发展问题不大国内外很多项目开始采用go重写java,php,python等,需要......
  • golang命令行cobra 快速入门教程
    cobra也许是go语言现有最好的命令行框架了,在各大项目中皆有使用,比如最出名的kubernetes,所以要写一个稍微复杂的命令行工具,使用cobra还是不错的,cobra内置了非常多有用的功能,包括但不限于,自动生成帮助文档,生成命令行代码的脚手架工具,智能提示等等。命令行相关知识在学习cobr......
  • golang 只读chan 测试
    packagemainimport( "fmt" "time")funcmyGoroutine(stopCh<-chanstruct{}){ //在协程中监听停止信号 for{ select{ case<-stopCh: //接收到停止信号,执行清理操作并退出 fmt.Println("cleanup") return default: //继续正常的协程逻......
  • golang 指针判断是否为空
    golang判断指针是否为空的方法:1、知道类型的情况下,自然是可以使用类型断言后判空。如ai,ok:=i.(*int),之后判断ai==nil。2、不知道是何种类型的指针,就只好借助反射了vi:=reflect.ValueOf(i),后使用vi.IsNil()来判断。但如果i里放到不是一个指针,调用IsNil会出异常,则可能要写......
  • golang 内存 stats 字段解释
    字段解释样例Alloc当前堆中已经分配给对象使用所占用的空间字节数322952TotalAlloc累计堆中已经分配给对象使用所占用的空间字节数,只会增长,不会减少29511472Sys总共从OS申请的字节数,包含运行时的heap、stack和其他内部数据结构的总和,它是虚拟内存空间。不一......
  • Golang -embed结合viper打包静态文件
    代码含有viper独立方式和goembed方式packagemainimport("bytes""embed""fmt""time""github.com/spf13/viper")//go:embedconfig.yamlvarf[]bytefuncmain(){//config:=viper.New()......
  • Golang高性能编程笔记--字符串拼接
    Golang中引入五种字符串拼接方法,分别如下:1.+拼接法2.fmt.Sprintf()3.strings.Builder4.bytes.Buffer5.[]byte代码示例,这里将根据《Go语言高性能编程》中的一节,来看一下这五种具体的方法:packagemainimport( "bytes" "fmt" "math/rand" "strings......
  • Golang - go:embed
    总结GoEmbed有什么用处能够在命令行工具里嵌入WEBgoinstall快速安装,启动web该web可以提供生成代码的平台该web可以提供例如jsontostruct等数据结构转换可以大大提高Go的工具链能力能够将前端资源打包到一个二进制包里,方便部署和安装静态资源访问没有io操作,速度非常......
  • VScode下golang 同一个包下不同文件之间函数调用问题
    VScode下golang同一个包下不同文件之间函数调用问题1.问题发现最近在vscode上学习golang的相关开发,发现这样一个问题:同文件夹下的两个文件,在都处于main包的情况下,无法在mian()里直接调用另一个文件中的函数,会报错:undefined。2.原因分析从语法层面上似乎并无问题,但是Go中main......