前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go viper 配置文件读取工具

Go viper 配置文件读取工具

作者头像
copy_left
发布2020-08-11 14:53:50
1.8K0
发布2020-08-11 14:53:50
举报
文章被收录于专栏:方球

安装

代码语言:javascript
复制
    go get github.com/spf13/viper
简单例子
代码语言:javascript
复制
/*
  目录
    - main.go
    - config.yaml
*/



func main(){
    
    
    viper.SetConfigName("config") // 设置配置名称
    viper.SetConfigFile("config.yaml") // 设置配置文件路径
    
    // 读取配置
    if err := viper.ReadInConfig(); err != nil{
        log.Fatal(err)
    }
    
    // 获取配置数据
    summary := viper.GetString("Summary")

    fmt.Println(summary)
        
}
新建 Viper

viper 提供默认 Viper对象, 可直接使用。 也通过 New 方法创建自定义Viper

代码语言:javascript
复制
// 直接使用默认对象
viper.GetInt("count")

// 获取全局Viper对象
globalViper := viper.GetViper()

// 新建Viper
conf := viper.New()

conf.SetConfigFile("config.yaml")
读取配置文件

从配置读取

代码语言:javascript
复制
 viper.SetConfigName("config")
 viper.SetConfigFile("config.yaml")
 
 if err := viper.ReadInConfig(); err != nil{
     log.Fatal(err)
 }
 
 version := viper.GetString("version")

从 io.Reader 读取

代码语言:javascript
复制
func main(){
    
    file, err := os.Open("./config.yaml")
    
    if err != nil{
        log.Fatal(err)
    }
    
    defer file.Close()
    
    viper.SetConfig("yaml")
    
    version := viper.GetString("version")
    // 这里需要设置配置类型, 否则无法正确解释配置内容
    
    // 如果未配置类型,也可以通过 Get 方法获取数据自行解析。
    
    
    
}

从 flag 读取

代码语言:javascript
复制
import (
    "fmt"
    "github.com/spf13/pflag"
    "github.com/spf13/viper"
)

func main() {
    pflag.String("ip", "127.0.0.1", "Server running address")
    pflag.Int64("port", 8080, "Server running port")
    pflag.Parse()

    viper.BindPFlags(pflag.CommandLine)
    fmt.Printf("ip :%s , port:%s", viper.GetString("ip"), viper.GetString("port"))


}
获取值

值得获取方法名为 Get[type] 形式

  • 接口类型,既未作解析
    • Get
  • 布尔
    • GetBool
  • 时间
    • GetDuration
    • GetTime
  • 数字
    • GetInt
    • GetInt32
    • GetInt64
    • GetFloat64
    • GetIntSlice
    • ....
  • 字符
    • GetString
    • GetStringSlice
    • ....
设置默认值

setDefault

代码语言:javascript
复制
 viper.setConfigFile("config.yaml")
 viper.SetDefault("port", 8000)
    
 println(viper.GetInt("port") // 8000
 // 这里未读取配置文件,将返回默认值
将配置映射到结构体
  • Unmarshal 将配置属性映射到 struct 中, 匹配模式类似 JSON 解析,只匹配大写开头的属性
代码语言:javascript
复制
type User struct{
    ID string
    Name string
    nickName string // 小写属性将不做匹配
}

func main(){
    
    /* config.yaml
        
        id: id11
        name: Rogan
        nickName: "wolf"  
    
    */
    ...
    
    user := &User{}
    
    viper.Unmarshal(user)
    
    println(&user) // { id11, Rogan } 
    
    
}
  • UnmarshalExact 用法与 Unmarshal 相同, 不同的是struct 必须与配置属性完全匹配,否则加报错
代码语言:javascript
复制
 /*
  config.yaml
  
    id: 111
    name: Rogan
 
 */
 
 type Conf_1 struct{
     Id string
     Name string
 }
 
 // 将报错
 type Conf_2 struct{
     Id string
 }
  • UnmarshalKey 匹配某一字段
代码语言:javascript
复制
 /*
  config.yaml
  
    server: 
        port: 8000
        host: localhost
 
 */

type ServerConf struct{
    Port int
    host string
}

func main(){
    
    ...
    
    serverConf := &ServerConf{}
    
    viper.UnmarshalKey("server", serverConfig)
    
}
混合配置 Merge[type]
  • MergeConfig
代码语言:javascript
复制
func main(){


    viper.SetConfigName("config")
    viper.SetConfigFile("config.yaml")

    viper.ReadInConfig()
    
    
    log.Println(viper.GetString("Summary"), viper.InConfig("Summary"))
    
    buff := []byte(`Name: jeck`)

    viper.MergeConfig(bytes.NewReader(buff))

    log.Println(viper.GetString("Name"))
    
}
监听文件
  • WatchConfig
代码语言:javascript
复制
func main(){

    viper.SetConfigName("config")
    viper.SetConfigFile("config.yaml")

    viper.ReadInConfig()

    viper.WatchConfig()

    for {

        log.Println(viper.GetString("version"))

        time.Sleep(time.Second * 5)

    }
    
    
}

// 初始 versioni: 1
// --> 1
// 修改config.yaml version: 2
// --> 2
  • OnConfigChange 响应配置变化
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
    • 简单例子
      • 新建 Viper
        • 读取配置文件
          • 获取值
            • 设置默认值
              • 将配置映射到结构体
                • 混合配置 Merge[type]
                  • 监听文件
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档