美文网首页
golang常用代码片段--定制化config组件

golang常用代码片段--定制化config组件

作者: 江江的大猪 | 来源:发表于2019-11-24 23:41 被阅读0次
    • 使用ini.v1配合fsnotify实现:
      1 解析ini配置文件
      2 监听配置文件的变化热更新配置
    import (
        "github.com/fsnotify/fsnotify"
        "github.com/sirupsen/logrus"
        "gopkg.in/ini.v1"
        "io/ioutil"
    )
    
    var iniConf *ini.File
    
    const confPath = "main.ini"
    
    func init() {
        var err error
        iniConf, err = ini.Load(confPath)
        if err != nil {
            logrus.Panicf("load conf error: [%s]", err)
        }
        iniConf.BlockMode = false
    
        // 增加热更新能力
        watcher, err := fsnotify.NewWatcher()
        if err != nil {
            logrus.Panicf("new watcher error: [%s]", err)
        }
        go func() {
            for {
                select {
                case event := <-watcher.Events:
                    if event.Op&fsnotify.Write == fsnotify.Write {
                        bytes, err := ioutil.ReadFile(confPath)
                        if err != nil {
                            logrus.Errorf("read conf error: [%s]", err)
                            break
                        }
                        logrus.Infof("modified conf file:%s", string(bytes))
                        newConf, err := ini.Load(confPath)
                        if err != nil {
                            logrus.Errorf("reload conf error: [%s]", err)
                            break
                        }
                        newConf.BlockMode = false
                        iniConf = newConf
                    }
                case err := <-watcher.Errors:
                    logrus.Errorf("watch conf file error: [%s]", err)
                }
            }
        }()
        if err := watcher.Add(confPath); err != nil {
            logrus.Panicf("add watcher file error: [%s]", err)
        }
    }
    
    func GetString(section, key, defaultValue string) string {
        return iniConf.Section(section).Key(key).MustString(defaultValue)
    }
    
    func GetInt(section, key string, defaultValue int) int {
        return iniConf.Section(section).Key(key).MustInt(defaultValue)
    }
    
    func GetInt64(section, key string, defaultValue int64) int64 {
        return iniConf.Section(section).Key(key).MustInt64(defaultValue)
    }
    
    func GetFloat64(section, key string, defaultValue float64) float64 {
        return iniConf.Section(section).Key(key).MustFloat64(defaultValue)
    }
    

    相关文章

      网友评论

          本文标题:golang常用代码片段--定制化config组件

          本文链接:https://www.haomeiwen.com/subject/wwgrwctx.html