toml用来作为配置文件,存储一些配置信息,那么当配置信息发生改变时,如何进行监测?
package main
import (
"fmt"
"log"
"time"
"github.com/fsnotify/fsnotify"
"github.com/pelletier/go-toml/v2"
)
type Config struct {
// 定义你的配置结构
}
func main() {
configFile := "config.toml"
config := &Config{}
// 首次加载配置文件
if _, err := toml.DecodeFile(configFile, config); err != nil {
log.Fatalf("Error reading TOML file: %v", err)
}
// 创建文件监控器
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
// 添加要监控的文件
if err := watcher.Add(configFile); err != nil {
log.Fatal(err)
}
// 监控文件变化,并重新加载
for {
select {
case event := <-watcher.Events:
if event.Op&fsnotify.Write == fsnotify.Write {
if _, err := toml.DecodeFile(configFile, config); err != nil {
log.Printf("Error reading TOML file: %v", err)
} else {
log.Println("Config file changed, reloaded successfully")
}
}
case err := <-watcher.Errors:
log.Printf("Watcher error: %v", err)
}
}
}
在这个例子中,程序首先加载TOML配置文件,然后使用fsnotify监控文件。每当文件发生变化时(例如被其他程序修改或更新),fsnotify会通过其Events channel 发送一个事件。监听器会检查这是否是一个写操作,如果是,它会重新解码并加载文件内容到config结构体中。
请注意,这个例子没有使用超时或者定期轮询的机制来检查文件是否发生变化。fsnotify会在文件真正发生变化时提供通知。这种方法比定时轮询更高效,因为它不会在文件没有变化时占用CPU时间。
0 Comments