首页 > 其他分享 >Go - Live reload of configurations

Go - Live reload of configurations

时间:2023-09-27 15:23:19浏览次数:28  
标签:updated Name initial json reload Live fsnotify Go config

main.go:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "os"
    "time"

    "github.com/fsnotify/fsnotify"
)

type config struct {
    Name string `json:"name"`
}

func readConfig() config {
    raw, _ := os.ReadFile("config.json")
    var c config
    json.Unmarshal(raw, &c)
    return c
}

func main() {
    currentConfig := readConfig()

    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    watcher.Add("config.json")

    for {
        time.Sleep(time.Second)
        select {
        case event := <-watcher.Events:
            fmt.Printf("Event happened: %v\n", event)
            if event.Has(fsnotify.Write) {
                currentConfig = readConfig()
                fmt.Println("configuration is updated")
            }
        default:
            fmt.Printf("%+v\n", currentConfig)
        }
    }
}

config.json:

{
    "name": "initial"
}

 

zzh@ZZHPC:/zdata/MyPrograms/Go/ccc$ go run main.go
{Name:initial}
{Name:initial}
{Name:initial}
{Name:initial}
{Name:initial}
Event happened: WRITE         "config.json"
configuration is updated
Event happened: WRITE         "config.json"
configuration is updated
{Name:updated}
{Name:updated}
{Name:updated}
{Name:updated}
{Name:updated}
^Csignal: interrupt

There were two WRITE events, which can be explained by below documentation of fsnotify (https://pkg.go.dev/github.com/fsnotify/fsnotify):

    //   fsnotify.Write     A file or named pipe was written to. A Truncate will
    //                      also trigger a Write. A single "write action"
    //                      initiated by the user may show up as one or multiple
    //                      writes, depending on when the system syncs things to
    //                      disk. For example when compiling a large Go program
    //                      you may get hundreds of Write events, so you
    //                      probably want to wait until you've stopped receiving
    //                      them (see the dedup example in cmd/fsnotify).

 

标签:updated,Name,initial,json,reload,Live,fsnotify,Go,config
From: https://www.cnblogs.com/zhangzhihui/p/17732801.html

相关文章

  • 一个思路:实现 golang 中的 `__file__` `__line__` 宏
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯测试zaplog发现,开启caller的调用,会使整个服务增加2%的损耗。其实文件及其行号完全可以在编译期加上去,没必要带来运行期的性能损耗。因此有一个思路,可以解决这......
  • 2023-09-20:用go语言,保证一定是n*n的正方形,实现从里到外转圈打印的功能 如果n是奇数,中
    2023-09-20:用go语言,保证一定是n*n的正方形,实现从里到外转圈打印的功能如果n是奇数,中心点唯一,比如abcdefghie是中心点,依次打印:efihgdabc如果n是偶数,中心点为最里层2*2的右下点比如abcdefghijklmnopqrstuvwxyz0123456789最里层是opu......
  • 2023-09-16:用go语言,给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p , 它们表示
    2023-09-16:用go语言,给你一个整数n和一个在范围[0,n-1]以内的整数p,它们表示一个长度为n且下标从0开始的数组arr,数组中除了下标为p处是1以外,其他所有数都是0。同时给你一个整数数组banned,它包含数组中的一些位置。banned中第i个位置表示arr[banned[i]]=......
  • goland编辑器编译的时候报错package xxx is not in GOROOT的原因排查
    先介绍下,我的目录部署情况1、GOROOT=C:\ProgramFiles\Go(我的golang环境装在c盘的)2、GOPATH=E:\Go(项目目录我放在E盘的)3、GO111MODULE=auto(默认值,没有改过)4、GOVERSION=go1.20.6(我的golang版本)5、项目结构,遵循官方推荐的方式E:\Go——bin——pkg——src 6、本次需要......
  • Django 使用模板语法编写新闻中心(爬虫获取数据)
    1.创建项目#创建项目django-adminstartprojectnews#进入项目目录cdnews#创建apppythonmanage.pystartappapp012.修改app2.1添加html进入app01文件夹在app01文件夹中添加templates文件夹在templates文件夹中添加index.html<!DOCTYPEhtml><......
  • 测试人员快速上手Django指南
    序言作为一个测试人员如果你有以下疑问,那么这篇文章将对你有很大帮助!1.网站的业务功能是如何实现的?参考章节:视图配置-实现网站业务功能2.服务器如何解析浏览器中的url?参考章节URL配置-提供url链接3.浏览器中的网页是如何展现给大家的?参考章节:模板-html页面的展示4.服务器如何与数据......
  • ABAP-MIGO保存修改数据增强
    三代增强:MB_DOCUMENT_BADI1METHODif_ex_mb_document_badi~mb_document_before_update.23FIELD-SYMBOLS:<fs_action>TYPEgodynpro-action,4<fs_refdoc>TYPEgodynpro-refdoc,5<lfs_xmseg>TYPEANYTABL......
  • golang 反射
    参考https://www.cnblogs.com/jiujuan/p/17142703.htmlfloat反射示例packagemainimport( "fmt" "reflect")funcmain(){ varxfloat64=1.2345 fmt.Println("==TypeOf==") t:=reflect.TypeOf(x) fmt.Println("type:&quo......
  • 简化 Go 开发:使用强大的工具提高生产力
    作为Go开发人员,应该都知道维持简洁高效开发工作流程的重要性。为了提高工作效率和代码质量,简化开发流程并自动执行重复性任务至关重要。在本文中,我们将探讨一些强大的工具和技术,它们将简化Go开发过程,助力您的编码之旅。 Cookiecutter:使用一致的模板快速启动项目问题描述......
  • ubuntu系统进行keepalived配置
    需要四大步骤先安装keepalived组件创建并配置keepalived.conf文件创建并配置check_nginx.sh文件检查状态,验证。1.安装keepalived组件sudoapt-getinstallkeepalived2.创建并配置keepalived.conf文件cd/etc/keepalived/sudotouchkeepalived.confsudovikeep......