聊聊Golang中很好用的viper配置模块
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《聊聊Golang中很好用的viper配置模块》,介绍一下Viper、配置,希望对大家的知识积累有所帮助,助力实战开发!
前言
viper 支持Yaml、Json、 TOML、HCL 等格式,读取非常的方便。
安装
go get github.com/spf13/viper
如果提示找不到golang.org/x/text/这个库,是因为golang.org/x/text/这个库在GitHub上托管的路径不一致。
解决办法:
可以从https://github.com/golang/text下载源码下来,然后到$GOPATH/src下面创建golang.org/x/文件夹(已存在的忽略),把压缩包的文件解压到golang.org/x/文件夹之下。
然后执行 go install -x golang.org/x/text 即可解决:
正文
初始结构目录如下:

准备测试使用的yaml文件,注意yaml的格式十分严格,主要是每个冒号后面必须要有空格,数组前要加“-”号表示连续(注意减号后面也有空格),内容如下:
TimeStamp: "2018-10-18 10:09:23" Address: "Shenzhen" Postcode: 518000 CompanyInfomation: Name: "Sunny" MarketCapitalization: 50000000 EmployeeNum: 200 Department: - "Finance" - "Design" - "Program" - "Sales" IsOpen: false
读取yaml文件:
package main
import (
"github.com/spf13/viper"
"fmt"
)
func main() {
//读取yaml文件
v := viper.New()
//设置读取的配置文件
v.SetConfigName("linux_config")
//添加读取的配置文件路径
v.AddConfigPath("./config/")
//windows环境下为%GOPATH,linux环境下为$GOPATH
v.AddConfigPath("$GOPATH/src/")
//设置配置文件类型
v.SetConfigType("yaml")
if err := v.ReadInConfig();err != nil {
fmt.Printf("err:%s\n",err)
}
fmt.Printf(
`
TimeStamp:%s
CompanyInfomation.Name:%s
CompanyInfomation.Department:%s `,
v.Get("TimeStamp"),
v.Get("CompanyInfomation.Name"),
v.Get("CompanyInfomation.Department"),
)
/*
result:
TimeStamp:2018-10-18 10:09:23
CompanyInfomation.Name:Sunny
CompanyInfomation.Department:[Finance Design Program Sales]
*/
}
也可以直接反序列化为Struct,非常的方便:
package main
import (
"github.com/spf13/viper"
"fmt"
)
func main() {
//读取yaml文件
v := viper.New()
//设置读取的配置文件
v.SetConfigName("linux_config")
//添加读取的配置文件路径
v.AddConfigPath("./config/")
//windows环境下为%GOPATH,linux环境下为$GOPATH
v.AddConfigPath("$GOPATH/src/")
//设置配置文件类型
v.SetConfigType("yaml")
if err := v.ReadInConfig();err != nil {
fmt.Printf("err:%s\n",err)
}
fmt.Printf( `
TimeStamp:%s
CompanyInfomation.Name:%s
CompanyInfomation.Department:%s `,
v.Get("TimeStamp"),
v.Get("CompanyInfomation.Name"),
v.Get("CompanyInfomation.Department"),
)
/*
result:
TimeStamp:2018-10-18 10:09:23
CompanyInfomation.Name:Sunny
CompanyInfomation.Department:[Finance Design Program Sales]
*/
//反序列化
parseYaml(v)
}
type CompanyInfomation struct{
Name string
MarketCapitalization int64
EmployeeNum int64
Department []interface{}
IsOpen bool
}
type YamlSetting struct{
TimeStamp string
Address string
Postcode int64
CompanyInfomation CompanyInfomation
}
func parseYaml(v *viper.Viper){
var yamlObj YamlSetting;
if err := v.Unmarshal(&yamlObj) ; err != nil{
fmt.Printf("err:%s",err)
}
fmt.Println(yamlObj)
/*
result:
{2018-10-18 10:09:23 Shenzhen 518000 {Sunny 50000000 200 [Finance Design Program Sales] false}}
*/
}
viper也提供了读取Command Line参数的功能:
package main
import (
"github.com/spf13/pflag"
"github.com/spf13/viper"
"fmt"
)
func main() {
pflag.String("hostAddress", "127.0.0.1", "Server running address")
pflag.Int64("port", 8080, "Server running port")
pflag.Parse()
viper.BindPFlags(pflag.CommandLine)
fmt.Printf("hostAddress :%s , port:%s", viper.GetString("hostAddress"), viper.GetString("port"))
/*
example:
go run main2.go --hostAddress=192.192.1.10 --port=9000
help:
Usage of /tmp/go-build183981952/b001/exe/main:
--hostAddress string Server running address (default "127.0.0.1")
--port int Server running port (default 8080)
*/
}
很多时候,我们服务器启动之后,如果临时想修改某些配置参数,需要重启服务器才能生效,但是viper提供了监听函数,可以免重启修改配置参数,非常的实用:
package main
import (
"github.com/spf13/viper"
"fmt"
"golang.org/x/net/context"
"github.com/fsnotify/fsnotify"
)
func main() {
//读取yaml文件
v := viper.New()
//设置读取的配置文件
v.SetConfigName("linux_config")
//添加读取的配置文件路径
v.AddConfigPath("./config/")
//windows环境下为%GOPATH,linux环境下为$GOPATH
v.AddConfigPath("$GOPATH/src/")
//设置配置文件类型
v.SetConfigType("yaml")
if err := v.ReadInConfig(); err != nil {
fmt.Printf("err:%s\n", err)
}
//创建一个信道等待关闭(模拟服务器环境)
ctx, _ := context.WithCancel(context.Background())
//cancel可以关闭信道
//ctx, cancel := context.WithCancel(context.Background())
//设置监听回调函数
v.OnConfigChange(func(e fsnotify.Event) {
fmt.Printf("config is change :%s \n", e.String())
//cancel()
})
//开始监听
v.WatchConfig()
//信道不会主动关闭,可以主动调用cancel关闭
完结
viper还有许多好用的功能,此文章只是举例说明了很小的部分。
补充:viper-配置信息处理框架(golang)
项目地址https://github.com/spf13/viper
1. viper
viper读取配置信息的优先级顺序,从高到底:
显式调用Set函数
命令行参数
环境变量
配置文件
key/value存储系统
默认值
2. 设置值
(1)设置默认值
viper.SetDefault("ContentDir", "content")
...
(2)读取配置文件
viper.SetConfigName("xxx") // 设置配置文件名,不要带后缀
viper.AddConfigPath("/path") // 第一个搜索路径
viper.AddConfigPath("../etc") // 设置为相对路径
err := viper.ReadInConfig() // 搜索路径,并读取配置数据
(3)***监视配置文件
viper支持应用程序运行时拥有读取配置文件的能力
viper实例通过WatchConfig函数:
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event)) {
fmt.Println("Config file changed:", e.Name)
})
(4)Set调用
viper.Set("Verbose", true)
viper.Set("LogFile", LogFile)
(5)绑定命令行参数
***viper支持绑定pflags参数【pflags是一个命令行参数解析库】
serveCmd.Flags().Int("port", 1138, "Port to run Application server on")
viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
3. 获取值
Get(key string) : interface{}
GetBool(key string) : bool
GetFloat64(key string) : float64
GetInt(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
IsSet(key string) : bool
以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。
终于介绍完啦!小伙伴们,这篇关于《聊聊Golang中很好用的viper配置模块》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!
Golang使用第三方包viper读取yaml配置信息操作
- 上一篇
- Golang使用第三方包viper读取yaml配置信息操作
- 下一篇
- 如何用go-zero 实现中台系统
-
- 热情的水杯
- 这篇博文真是及时雨啊,太细致了,真优秀,收藏了,关注作者大大了!希望作者大大能多写Golang相关的文章。
- 2023-01-25 15:48:55
-
- 传统的大山
- 这篇技术贴真及时,好细啊,赞 ??,已加入收藏夹了,关注up主了!希望up主能多写Golang相关的文章。
- 2022-12-28 23:27:43
-
- Golang · Go教程 | 1星期前 | goroutine · Context · 超时控制 · Go教程 · 后端开发 · Go Goroutine context 超时控制 WithTimeout Done QueryContext
- Go context 超时控制实战:从接口入口到 goroutine 回收的完整流程
- 166浏览 收藏
-
- Golang · Go教程 | 1星期前 | map · 并发安全 · RWMutex · sync.Map · Go教程 · 并发安全 RWMutex sync.Map Go map并发读写 go test race
- Go map 并发读写崩溃怎么办:从复现报错到 RWMutex 修复的完整流程
- 272浏览 收藏
-
- Golang · Go教程 | 1星期前 | singleflight · 并发控制 · Go教程 · 缓存治理 · 接口优化 · Go 并发请求 缓存击穿 singleflight 缓存回填
- Go singleflight 防缓存击穿实战:相同请求只查一次数据库
- 114浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 2373次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 2184次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 2141次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 2345次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 2308次使用
-
- Go语言简介和环境配置
- 2023-01-07 109浏览
-
- golang常用库之配置文件解析库-viper使用详解
- 2022-12-27 115浏览
-
- 安装MySQL后,需要调整的10个性能配置项
- 2023-01-17 140浏览
-
- mysql的一些配置操作
- 2023-02-24 147浏览
-
- go1.8之安装配置具体步骤
- 2023-01-07 151浏览

