Golang 项目配置文件读取之 viper 实践

在我们做一个工程化项目的时候,经常涉及到配置文件的读取,viper 包很好地满足这一需求,而且在 Golang 生态中是流行度最高的。导入方式:

import "github.com/spf13/viper"

这里分享下我对 viper 包的使用关键实践:

首先,在代码工程中单独定义一个包(我一般起名为 config 或者 configloader),这个包专门用来读取加载配置文件,并做相关校验,包里面我定义 3 个函数和 1 个全局变量:

  • var viperConfig *viper.Viper: 全局配置变量;
  • func Init(configDir string) error: 初始化加载配置文件;
  • func GetConfig() *viper.Viper: 获取配置文件,供其他包调用,拿到配置文件实例;
  • func validateConfig(v *viper.Viper) error: 校验配置文件;

接下来在工程入口处引用上面这个配置包的 Init 函数做配置文件的初始化和加载,加载的结果就是实例化一个 *viper.Viper 全局变量,在其他包中用的时候调用这个配置包的 func GetConfig() *viper.Vipe 函数即可拿到这个全局变量,即配置文件内容。

示例代码(代码仅供参考,截取字自前做的爬虫程序部分代码):

package configloaderimport ("fmt""github.com/spf13/viper""example.com/pkg/util/fs"
)// viperConfig 全局配置变量
var viperConfig *viper.Viper// 初始化配置文件相关设置,在 main 包中调用进行初始化加载
func Init(configDir string) error {if configDir == "" {return fmt.Errorf("config directory is empty")}if !fs.PathExists(configDir) {return fmt.Errorf("no such config directory: %s", configDir)}viper.SetConfigName("spider")  // name of config file (without extension)viper.AddConfigPath(configDir) // path to look for the config file inerr := viper.ReadInConfig()    // Find and read the config fileif err != nil {                // Handle errors reading the config filereturn fmt.Errorf("Fatal error config file: %s \n", err)}viperConfig = viper.GetViper()if err = validateConfig(viperConfig); err != nil {return fmt.Errorf("invalid configuration, error msg: %s", err)}return nil
}// GetConfig 获取全局配置
func GetConfig() *viper.Viper {return viperConfig
}func validateConfig(v *viper.Viper) error {var (urlListFile     = v.GetString("urlListFile")outputDirectory = v.GetString("outputDirectory")maxDepth        = v.GetInt("maxDepth")crawlInterval   = v.GetInt("crawlInterval")crawlTimeout    = v.GetInt("crawlTimeout")targetUrl       = v.GetString("targetUrl")threadCount     = v.GetInt("threadCount"))if urlListFile == "" {return fmt.Errorf("invalid targetUrl: %s, please check configuration", urlListFile)}if outputDirectory == "" {return fmt.Errorf("invalid targetUrl: %s, please check configuration", outputDirectory)}if maxDepth <= 0 {return fmt.Errorf("invalid maxDepth: %d, please check configuration", maxDepth)}if crawlInterval <= 0 {return fmt.Errorf("invalid crawlInterval: %d, please check configuration", crawlInterval)}if crawlTimeout <= 0 {return fmt.Errorf("invalid crawlTimeout: %d, please check configuration", crawlTimeout)}if targetUrl == "" {return fmt.Errorf("invalid targetUrl: %s, please check configuration", targetUrl)}if threadCount <= 0 {return fmt.Errorf("invalid threadCount: %d, please check configuration", threadCount)}return nil
}

Golang 项目配置文件读取之 viper 实践相关推荐

  1. viper4android io错误,golang常用库之配置文件解析库-viper使用详解

    一.viper简介 viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 c ...

  2. 解决idea中maven项目无法读取src/main/java目录下面的配置文件问题

    解决idea中maven项目无法读取src/main/java目录下面的配置文件问题 参考文章: (1)解决idea中maven项目无法读取src/main/java目录下面的配置文件问题 (2)ht ...

  3. java tomcat 读取配置文件端口_跟我学Java编程—应用读写项目配置文件的Properties类...

    我们在开发软件项目时,经常需要读取项目的一些配置数据.例如,项目里用到的数据库链接地址.Tomcat服务端口号.数据文件备份地址等信息都需要放到一个配置文件里,由程序读取并获取.这样做的好处是,当需要 ...

  4. golang项目持续集成Travis-CI实践

    文章目录 shorturl 1 `Travis-ci`支持 2 `.travis.yml` 3 Hello World 4 短链服务 5 添加持续集成 6 问题fix实践 7 还得是GOPATH 8 ...

  5. Go项目配置管理神器之viper使用详解

    目录 1. viper的介绍 2. viper的使用 2.1  Viper对象的创建 2.2 预设一些默认配置 2.3 从命令行工具的选项参数Flags读取 2.4 从环境变量读取 2.5 从配置文件 ...

  6. C#操作项目配置文件

    前言 对于项目配置文件的读取和修改,.net 提供了ConfigurationManager(位于System.Configuration命名空间) 和WebConfigurationManager( ...

  7. 【Go API 开发实战 6】基础 2:配置文件读取

    配置文件读取 本节核心内容 介绍 apiserver 所采用的配置解决方案 介绍如何配置 apiserver 并读取其配置,以及配置的高级用法 本小节源码下载路径:demo02 可先下载源码到本地,结 ...

  8. golang 依赖管理_简介:如何管理Golang项目依赖项

    golang 依赖管理 by Ying Kit Yuen 英杰苑 简介:如何管理Golang项目依赖项 (An intro to dep: How to manage your Golang proj ...

  9. springboot自动配置文件读取以及源码分析

    今天来讲讲springboot自动配置文件读取以及源码分析 springboot启动之后 1.首先进入@springbootApplication(如上图) 里面的**@EnableAutoConfi ...

最新文章

  1. 《构建高可用Linux服务器 第3版》—— 1.4 Linux服务器的日志管理
  2. asp.net MVC中实现调取web api
  3. 主动模式FTP与被动模式FTP该如何选择
  4. 【pmcaff】重磅干货,必读的扁平化设计技巧
  5. CATALINA_BASE与CATALINA_HOME的区别
  6. 【转】WPF 入门《常用控件》
  7. cmd运行python程序
  8. Ntdll32.dll病毒清除办法
  9. 使用Docker快速搭建FTP服务器
  10. 一起学习MVC(4)-entity SQL语句
  11. 老板下死命令:必须将20M文件从30秒压缩到1秒,我是如何做到的?
  12. CCF CSP 201903-1 小中大(C语言100分)[序列处理]
  13. Python进行各项统计检验
  14. vim编辑器跳转、复制、剪切(2)
  15. 安卓android百度图像识别 摄像头黑屏问题
  16. 计网实验——直连网络设计
  17. 手脱FSG压缩壳及问题处理
  18. Qgis教程12:动态展示
  19. Android 12.0 锁屏页面禁止下拉状态栏
  20. 郁 繁体为“鬰” 古同 “鬱”

热门文章

  1. 这些手写代码会了吗?少年
  2. 算法的时间复杂度表示法(大O表示法)
  3. 第一次用计算机证明的数学定理是,勾股定理是一个基本几何定理,是人类早期发现并证明的重要数学定理之一,用代数思想解决几何...
  4. 气候变化如何影响致命的龙卷风?
  5. OpenJudge1758 二叉树
  6. 0.前端简历编写和面试前准备
  7. 如何看待药物治疗过程中的副作用?
  8. 具体做事的人一定要承担责任吗?
  9. 【Unity精灵】2D精灵图片替换常见的问题
  10. 怎么把一张普通照片变成证件照?这样做其实非常简单