Go viper 配置文件读取工具
时间:2022-07-23
本文章向大家介绍Go viper 配置文件读取工具,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
安装
go get github.com/spf13/viper
简单例子
/*
目录
- 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
// 直接使用默认对象
viper.GetInt("count")
// 获取全局Viper对象
globalViper := viper.GetViper()
// 新建Viper
conf := viper.New()
conf.SetConfigFile("config.yaml")
读取配置文件
从配置读取
viper.SetConfigName("config")
viper.SetConfigFile("config.yaml")
if err := viper.ReadInConfig(); err != nil{
log.Fatal(err)
}
version := viper.GetString("version")
从 io.Reader 读取
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 读取
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
viper.setConfigFile("config.yaml")
viper.SetDefault("port", 8000)
println(viper.GetInt("port") // 8000
// 这里未读取配置文件,将返回默认值
将配置映射到结构体
- Unmarshal 将配置属性映射到 struct 中, 匹配模式类似 JSON 解析,只匹配大写开头的属性
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 必须与配置属性完全匹配,否则加报错
/*
config.yaml
id: 111
name: Rogan
*/
type Conf_1 struct{
Id string
Name string
}
// 将报错
type Conf_2 struct{
Id string
}
- UnmarshalKey 匹配某一字段
/*
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
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
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 响应配置变化
- 关于评审开发人员的sql语句(r3笔记第11天)
- 性能下降的不定时炸弹_过旧的sql_profile(r3笔记第9天)
- 关于抓取session信息的一个脚本(r3笔记第8天)
- oracle PL/SQL中的重载 (r3笔记27天)
- 使用Python进行描述性统计
- 关于修改分区表的准备和操作细则(r3笔记26天)
- 一条"简单"的sql语句和小兔子买面包的故事 (r3笔记第25天)
- 生产环境sql语句调优实战第八篇(r3笔记第24天)
- Python做文本挖掘的情感极性分析
- 通过vmstat的简单分析数据库操作 (r3笔记23天)
- 海量数据迁移之一个误操作的问题总结(r3笔记第21天)
- 关于dblink锁定带来的问题(r3笔记第20天)
- 利用sql语句解决简单的数学题(r3笔记第19天)
- 用XGBoost做时间序列预测—forecastxgb包
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TP5.0框架实现无限极回复功能的方法分析
- Tensorflow之MNIST CNN实现并保存、加载模型
- tensorflow 大于某个值为1,小于为0的实例
- YII框架模块化处理操作示例
- 基于tensorflow for循环 while循环案例
- 浅谈Python 命令行参数argparse写入图片路径操作
- 硬核干货丨游戏大世界的超远视距处理手法,建议收藏!
- python实现npy格式文件转换为txt文件操作
- 从0开始打造UI框架:动态化框架Scrollview物理学算法解析
- 基于Keras的格式化输出Loss实现方式
- PHP信号处理机制的操作代码讲解
- php防止表单重复提交实例讲解
- Python实现封装打包自己写的代码,被python import
- 创建一个 Serverless 应用,真的没有这么难!
- PHP使用mongoclient简单操作mongodb数据库示例