zoukankan      html  css  js  c++  java
  • (转)Golang第三方包Viper的使用

    【摘要】

    viper是一个简单好用的读取配置文件的第三方开源库,它支持多种类型配置的读写,包括json、yml、环境变量、命令行等,使用该库可以免去一些繁琐的配置读取代码实现。

    一  基本原理

    当viper被调用来获取参数时,它的基本执行逻辑如下:

    1.通过自己的内部实现,获取指定对象(配置文件,环境变量等)的内容

    2.将获取的内容解析,得到键值对集合,并将其存入自身的storage中

    3.等待ReadInConfig,或GetInt等方法取值

    从上面描述可知,无论viper获取参数的来源是什么,最终的参数集合都是viper内部存放的键值对集合,也就可以使用viper.Get等方法获取,这种方案的好处就是,当配置来源发生变化时,只需要修改viper的来源解析代码,而不需要对已经嵌入业务代码的参数读写逻辑做任何修改。

    二  使用方法

    首先,通过命令go get github.com/spf13/viper 获取viper包

    2.1     读取配置文件:

    通过指定目录和文件名、文件类型,即可实现对指定文件的配置读取:

    viper.SetConfigName("config") // 文件名
    viper.AddConfigPath("/etc/appname/")   // 文件路径
    viper.AddConfigPath("$HOME/.appname")  //可以使用多个文件路径           
    err := viper.ReadInConfig() // 将配置读入viper中存储
    err != nil { // Handle errors reading the config file
           panic(fmt.Errorf("Fatal error config file: %s 
    ", err))
    }
    ... //viper.GetString(...)

    2.2     读取配置流:

    viper.SetConfigType("yaml") // 设置配置的格式类型
    var yamlExample = []byte(...) //...中为yml格式的字符串
    viper.ReadConfig(bytes.NewBuffer(yamlExample))  //viper.ReadConfig()可以传入任//何实现io.Reader接口的对象
    viper.Get("name") // 使用Get获取刚才读取的结果

    2.3     设置参数默认值:

    viper.SetDefault("ContentDir", "content")
    viper.SetDefault("LayoutDir", "layouts")
    viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})

    2.4     监听配置文件的读写事件:

    配置监听事件后,当文件出现读写操作,就会触发事件,调用其声明好的方法,该步骤通常用于处理配置文件的重载,有时也额外用于文件监控功能

    viper.WatchConfig()  //启动监听
    viper.OnConfigChange(func(e fsnotify.Event) {   //注册文件监控的回调函数
           fmt.Println("Config file changed:", e.Name)
    })  

    2.5     配置参数别名:

    配置参数别名后,使用viper.Get方法时,传入原本的key或者传入别名都可以获取指定参数的值,通常用于美化/简化配置文件的参数格式

    viper.RegisterAlias("base", "别名") //注册别名
    viper.Set("base", true)  
    viper.GetBool("base") //结果: true
    viper.GetBool("别名") //结果: true

    2.6     设置/覆盖参数值:

    手动覆盖参数,此处不多赘述

    viper.Set("base", true)

    2.7     获取命令行参数

    viper的命令行参数获取实际上是通过绑定flag对象实现的,使用方法相对其他几种配置来源稍微复杂一点

    package main
    import (
           "flag"
           "github.com/spf13/pflag"
    )
    
    func main() {
           // 使用基础的flag包
           flag.Int("flagname", 1234, "help message for flagname")
        //将flag转换为pflag
           pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
           pflag.Parse()
        //通过bind,将命令行参数绑定到viper的内部键值对集合中
           viper.BindPFlags(pflag.CommandLine)
           i := viper.GetInt("flagname") // 此处已可以获取参数

    ---------------------
    原文来自【学领未来】,转载时请保留原文链接。
    链接:http://bbs.learnfuture.com/topic/6900

  • 相关阅读:
    GitHub:如何构建一个股票市场知识图谱?(附代码&链接)
    java运行jar命令提示没有主清单属性
    Modern Qt Development: The Top 10 Tools You Should Be Using
    没本事就不要去追逐梦想了
    ddd
    5分钟快速构建苹果IPA免费发布服务器
    Windows热键注册的底层原理
    云设计模式-Design patterns for microservices
    ubuntu16安装最新版docker
    什么是Docker—无服务器计算服务
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/14108298.html
Copyright © 2011-2022 走看看