Viper的使用方法

一、背景

Viper是适用于Go应用程序(包括Twelve-Factor App)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:
(1)设置默认值
(2)从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件读取配置信息
(3)实时监控和重新读取配置文件(可选)
(4)从环境变量中读取
(5)从远程配置系统(etcd或Consul)读取并监控配置变化
(6)从命令行参数读取配置
(7)从buffer读取配置
(8)显式配置值

包的引用

github.com/spf13/viper

二、读取配置文件

1、yaml文件的书写

port: 8080
cas: "this is my cas"mysql:host: "127.0.0.1"port: "3306"dbname: "cas"

注:一定要在键值对的:后面加上空格符号

2、配置Viper最少知道在那个路径下寻找需要的配置文件(可以不知道全部路径和其他)

func InitConfig(){viper.SetConfigName("Conf")  //找寻文件的名字viper.SetConfigType("yaml") // 找寻文件的类型viper.AddConfigPath("conf")   //从当前目录下的哪个文件夹找寻,viper.AddConfigPath(".")  //.代表当前文件夹找寻,可以多个目录找寻,生成数组err:=viper.ReadInConfig()    //读取配置文件if err!=nil{if v,ok:=err.(viper.ConfigFileNotFoundError);ok{fmt.Println(v)}else{panic(fmt.Errorf("read config err=%s",err))}}
}func main(){InitConfig()cas:=viper.GetString("cas")   //Get cas Confighost:=viper.GetString("mysql.host")  //Get mysql.host Configfmt.Println("Get Config")fmt.Println(cas,host)
}

三、写入配置文件

从配置文件中读取配置文件是有用的,但是有时你想要存储在运行时所做的所有修改。为此,可以使用下面一组命令,每个命令都有自己的用途:

1、WriteConfig - 将当前的viper配置写入预定义的路径并覆盖(如果存在的话)。如果没有预定义的路径,则报错。

2、SafeWriteConfig - 将当前的viper配置写入预定义的路径。如果没有预定义的路径,则报错。如果存在,将不会覆盖当前的配置文件。

3、WriteConfigAs - 将当前的viper配置写入给定的文件路径。将覆盖给定的文件(如果它存在的话)。

4、SafeWriteConfigAs - 将当前的viper配置写入给定的文件路径。不会覆盖给定的文件(如果它存在的话)。

四、监控并重新读取配置文件

 viper.WatchConfig()viper.OnConfigChange(func(in fsnotify.Event) {//Can Add Some Logicsfmt.Println("Config Was Changed",in.Name)})

五、从Viper中获取值

Get(key string) : interface{}
GetBool(key string) : bool
GetFloat64(key string) : float64
GetInt(key string) : int
GetIntSlice(key string) : []int
GetString(key string) : string
GetStringMap(key string) : map[string]interface{}
GetStringMapString(key string) : map[string]string
GetStringSlice(key string) : []string
GetTime(key string) : time.Time
GetDuration(key string) : time.Duration
AllSettings() : map[string]interface{}
//判断配置中是否存在这个值
IsSet(key string) : bool

Viper可以通过传入.分隔的路径来访问嵌套字段

特殊情况:

{"datastore.metric.host": "0.0.0.0","host": {"address": "localhost","port": 5799},"datastore": {"metric": {"host": "127.0.0.1","port": 3099},"warehouse": {"host": "198.0.0.1","port": 2112}}
}GetString("datastore.metric.host") // 返回 "0.0.0.0"

六、提取子树

app:cache1:max-items: 100item-size: 64cache2:max-items: 200item-size: 80

让subv赋值给app.cache1

subv := viper.Sub("app.cache1")

subv现在就代表:

 max-items: 100item-size: 64

七、反序列化与序列化

1、根据yaml定制结构体

port: 8080
cas: "this is my cas hhh"mysql:host: "127.0.0.1"port: "3306"dbname: "cas"

定制的结构体

package modelstype Config struct{Port int  `mapstructure:"port"`Cas string `mapstructure:"cas"`MySqlConfig `mapstructure:"mysql"`
}type MySqlConfig struct{Host string `mapstructure:"host"`Port int `mapstructure:"port"`Dbname string `mapstructure:"dbname"`
}

反序列化

 err=viper.Unmarshal(&c)if err!=nil{panic("Umarshal ERR")}

也可将Config文件序列化成字符串

import (yaml "gopkg.in/yaml.v2"// ...
)
func yamlStringSettings() string {c := viper.AllSettings()bs, err := yaml.Marshal(c)if err != nil {log.Fatalf("unable to marshal config to YAML: %v", err)}return string(bs)

如果看完对自己有所帮助,请点赞支持

Viper的使用方法相关推荐

  1. 配置管理神器 Viper

    文章目录 配置管理神器 Viper Viper介绍 为什么选择Viper 把值存入Viper 设置默认值 读取配置文件 写入配置文件(了解) 监控并重新读取配置文件 从io.Reader读取配置(了解 ...

  2. viper4android io错误,Go之Viper

    简介 Viper是适用于Go应用程序的完整配置解决方案.它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式; Viper是适用于Go应用程序(包括Twelve-Factor App)的 ...

  3. spf13/viper

    参考资料 仓库地址 https://github.com/spf13/viper Viper(毒蛇,蝰蛇)是Golang应用程序开源配置解决方案,包括12-Factor应用程序.旨在应用程序中处理各种 ...

  4. github.com/spf13/viper go viper包介绍

    什么是Viper? Viper是一个Go应用程序完整的配置文件解决方案,包括12-Factor应用程序.它被设计为:在应用程序中工作,可以处理所有类型的配置需求和格式.它支持: 设置默认值 从JSON ...

  5. viper4android io错误,viper操作文档

    # viper操作文档 # 1 Viper简单介绍 # 1.1 什么是Viper Viper介绍 Viper是Go应用程序的完整配置解决方案,包括12-Factor应用程序.它旨在在应用程序中工作,并 ...

  6. 各类配置文件格式简介(ini,yaml,conf,xml...)和nb的Viper

    目录 配置文件 ini 介绍 语法 demo 库 json 语法 demo 库 xml 介绍 语法&demo yaml demo toml properties HOCON plist(pli ...

  7. go_viper解析

    什么是Viper? Viper是Go应用程序的完整配置解决方案,包括12-Factor应用程序.它旨在在应用程序中工作,并可以处理所有类型的配置需求和格式.它支持: 设置默认值 从JSON,TOML, ...

  8. G0第25章:Gin框架进阶项目实战

    1 Gin框架源码解析 通过阅读gin框架的源码来探究gin框架路由与中间件的秘密. 1.1 Gin框架路由详解 gin框架使用的是定制版本的httprouter,其路由的原理是大量使用公共前缀的树结 ...

  9. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

最新文章

  1. 宏基因组合种树第290期—油松
  2. Python实现链表
  3. Matlab读取txt文件中的数据(使用textread函数)
  4. python中高阶函数和装饰器_三.Python高阶函数和装饰器
  5. 计算机应用基础模块4客观题,国开河北[课程号]00815《计算机应用基础》模块4PowerPoint2010电子演示文稿系统——客观题辅导答案...
  6. Scrapy定向爬虫教程(二)——提取网页内容
  7. 鸿蒙os什么时候用到手机,鸿蒙OS何时用在手机上?余承东称明年会有
  8. java实验的总结_java实验总结
  9. “李刚畅谈Java编程人生”讲座
  10. 持续交付——不仅仅是技术
  11. 算法:逆序局部链表 Reverse Linked List II
  12. 电容电感频率测量表 电路原理
  13. 生意参谋指数转化api
  14. java集合框架之集合工具类Arrays类
  15. 远程登陆Win10自带子系统Ubuntu-22.04
  16. 数据可视化(一):matplotlib
  17. ulipad 无法安装使用、无法调试、64位版本问题 ImportError: No module named comtypes 整体解决方案!
  18. antd select 等组件可搜索问题
  19. php 邮币卡源码,如何使用CSS的Grid布局实现小松鼠邮票的效果(附源码)
  20. 外贸行业网站的seo优化推广怎么做?优化技巧详解

热门文章

  1. html清理超链接前面的黑点,吹毛求疵:解决IE6-7给链接加黑点边框的三种方案
  2. 一、CCD原理及实现方法
  3. cudnn.benchmark = True什么意思
  4. matlab和vc,Vc++和matlab双剑合璧
  5. Java程序员如何写简历,给大家一个小建议?
  6. 双相障碍快速循环发作的治疗:证据回顾 | 文献述评
  7. 从负债累累到老板,00后的逆袭之路
  8. 衡量基因相对表达量的RPKM、FPKM、TPM详解
  9. 线性代数学习笔记——行列式(针对期末与考研)
  10. 面试——说说你最荣耀的事(你做过最有成就感的事情)