文章目录

  • 前言
  • 一、ini包
    • 1、下载
    • 2、使用方法
      • 法一:简单方法
      • 法二:结构体反射
  • 二、viper配置管理
    • 1、下载
    • 2、viper的特点
    • 3、使用方法
      • 读取
  • 总结

前言

平时写项目都是习惯于将什么Mysql,Redis,Kafka等这些需要配置的配置信息单独用一个conf文件来进行存放,以便管理


一、ini包

首先一个方法是比较轻量级的方法,就是ini包里的方法,很简单便捷


1、下载

go get gopkg.in/ini.v1进行下载

2、使用方法

一般将配置信息使用
这个ini文件进行存储
格式如下

[database]
Db = mysql
DbHost = 127.0.0.1
DbPort = 3306
DbUser = root
DbPassWord = ******
DbName = ****[kafka]
address =127.0.0.1:9092
topic = web_log[collect]
logfile_path =d:\logs\s4.log

使用这个包我们一般有两种方式


法一:简单方法

file, err := ini.Load("conf/config.ini")
if err != nil {fmt.Println("配置文件读取错误,请检查文件路径:", err)
}

读取到配置文件内容到file中

 DbHost = file.Section("database").Key("DbHost").String()DbPort = file.Section("database").Key("DbPort").String()DbUser = file.Section("database").Key("DbUser").String()DbPassWord = file.Section("database").Key("DbPassWord").String()DbName = file.Section("database").Key("DbName").String()fmt.Println(DbHost, DbPort, DbUser, DbPassWord, DbName)
// 127.0.0.1 3306 root 123456 ginblog

这样就可以拿到具体的key了

而一般来讲为了模块化都会将不同技术的配置信息封装到不同的函数里进行模块化管理
eg:

     func LoadData(file *ini.File) {...}func LoadKafka(file *ini.File) {...}func LoadRedis(file *ini.File) {...}

法二:结构体反射

把配置文件里的信息提前使用结构体封装然后进行反射

type Config struct {KafkaConfig `ini:"kafka"`Collect     `ini:"collect"`Etcd        `ini:"etcd"`
}type KafkaConfig struct {Address string `ini:"address"`Topic   string `ini:"topic"`
}type Collect struct {LogFilePath string `ini:"logfile_path"`
}type Etcd struct {Address     string `ini:"address"`Collect_key string `ini:"collect_key"`
}

然后使用结构体的tag进行反射读取配置信息

var configObj = new(Config)
err := ini.MapTo(configObj, "./conf/Config.ini")
if err != nil {logrus.Error("config failed err:", err)return
}

这样操作一番所有的配置信息都拿到了在configObj中,比法一更加的一步到位


二、viper配置管理

viper相较于法一的包就比较重量级了,比较的完善,现如今也是go比较流行的完整配置解决方案


1、下载

go get github.com/spf13/viper进行安装viper包


2、viper的特点

viper的特性如下

设置默认值
从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件读取配置信息
实时监控和重新读取配置文件(可选)
从环境变量中读取
从远程配置系统(etcd或Consul)读取并监控配置变化
从命令行参数读取配置
从buffer读取配置 显式配置值

而本文章主要讲解viper从配置文件读取信息并实时监控配置文件进行热加载
若对其他内容有兴趣可以看看李文周老师博客进行了解

3、使用方法

跟ini一样一般创建一个conf文件存储配置信息,本次例子用yaml文件做例子

mysql:host: 127.0.0.1port: 3306user: "root"password: "****"dbname: "****"max_open_conns: 20max_idle_conns: 20
redis:host: 127.0.0.1port: 6379password: ""db: 0pool_size: 100

读取

首先一样的也是建结构体进行反射

type AppConfig struct {*MySQLConfig `mapstructure:"mysql"`*RedisConfig `mapstructure:"redis"`
}
type MySQLConfig struct {Host         string `mapstructure:"host"`User         string `mapstructure:"user"`Password     string `mapstructure:"password"`DB           string `mapstructure:"dbname"`Port         int    `mapstructure:"port"`MaxOpenConns int    `mapstructure:"max_open_conns"`MaxIdleConns int    `mapstructure:"max_idle_conns"`
}type RedisConfig struct {Host         string `mapstructure:"host"`Password     string `mapstructure:"password"`Port         int    `mapstructure:"port"`DB           int    `mapstructure:"db"`PoolSize     int    `mapstructure:"pool_size"`MinIdleConns int    `mapstructure:"min_idle_conns"`
}

然后就是使用viper进行读取

 viper.SetConfigFile("config配置文件绝对路径")err = viper.ReadInConfig() // 读取配置信息if err != nil {// 读取配置信息失败fmt.Printf("viper Read Config failed, err:%v\n", err)return}// 把读取到的配置信息反序列化到 Conf 变量中if err := viper.Unmarshal(Conf); err != nil {fmt.Printf("viper Unmarshal failed, err:%v\n", err)}viper.WatchConfig()  // 对配置文件进行监视,若有改变就重新反序列到Conf中viper.OnConfigChange(func(in fsnotify.Event) {fmt.Println("配置文件修改了...")if err := viper.Unmarshal(Conf); err != nil {fmt.Printf("viper.Unmarshal failed, err:%v\n", err)}})return
}

这就是使用viper对配置文件进行管理的方法

总结

不管是ini还是viper,可以看到都是非常方便的,但是viper的功能更加完善,更适用于企业级开发吧,ini就适合小型项目的使用就我个人感觉

golang读取conf文件的两种方式(ini和Viper)相关推荐

  1. 第四章:数据存储-csv文件处理-读取csv文件的两种方式

    直接学习:https://edu.csdn.net/course/play/24756/280718 csv文件处理-读取csv文件的两种方式: # 这种方式读取到的每一条数据是个列表,所以需要通过下 ...

  2. java读取csv文件的两种方式

    java读取csv文件的两种方式 1.CsvReader读取 import com.csvreader.CsvReader; /*** CsvReader 读取* @param filePath* @ ...

  3. nodejs 逐行读取文件的两种方式

    nodejs 逐行读取文件的两种方式 通过readline的方式 const fs = require('fs'); const readline = require('readline');let ...

  4. Spark读取Hive数据的两种方式与保存数据到HDFS

    Spark读取Hive数据的两种方式与保存数据到HDFS Spark读取Hive数据的方式主要有两种 1. 通过访问hive metastore的方式,这种方式通过访问hive的metastore元数 ...

  5. django + python上传文件的两种方式

    突然心血来潮,研究了下django+python上传文件的两种方式. 第一:直接采用文件读写的方式上传 1. settings.py文件中设置文件的存放路径和文件读取路径 MEDIA_ROOT = o ...

  6. Ruby读取Excel文件的两种方法

    用Ruby读取Excel文件的两种重要方式 1. 通常做法,查阅微软提供的API了,需要包含win32, 在ruby前加入,require 'win32ole' 例如: require 'win32o ...

  7. 读写ASCII文件的两种方式

    读写ASCII文件的两种方式 :读取文件的路径 EXAMPLE: IDL>asciiFile=FILE_DIRNAME(ROUTINE_FILEPATH('TEST_READF')) + '\d ...

  8. C# 读取XML文件的几种方式

    在开发过程中,我们有时会需要保存到本地一些结构化数据或者配置信息,这时就可以选择用xml文件.当然xml的用途也不仅仅是这些. 这一篇来谈一谈关于读取xml文件的几种方式: 我们有以下两个文件,一个是 ...

  9. Python加载csv文件的两种方式

    本文主要讲解下Python加载csv文件的两种方式,如果知道如何处理的就不必往下看了! 下面来简单介绍下. 实例中的数据集是kaggle的Digit Recognizer的train.csv文件,数据 ...

最新文章

  1. 利用三层交换机实现VLAN的通信实验报告
  2. 网站SEO优化的方法
  3. 程序语言python循环_《python语言程序设计》_第5章_循环
  4. 如何把一些不同类型的数据混合存入一片内存中_如何从技术上增强以太坊的隐私性?...
  5. linux信号及其含义
  6. MFC开发-MFC 树控件 将一棵树全部展开
  7. matlab2012b函数问题,MATLAB版本(2012b 64bit)在尝试调用svmtrain函数时报错
  8. 看博客学学Android(二十一)
  9. 勤能补拙 VS 思考补拙
  10. 【BZOJ-13361337】Alie最小圆覆盖 最小圆覆盖(随机增量法)
  11. java虚拟机存储空间_配置Java虚拟机内存大小
  12. 【3dmax千千问】初学3dmax插件神器第17课|VRAY渲染教程|哪三种表现方式最能影响3dmax疯狂模渲大师设计效果图的写实程度?食住玩3dmax入门到精通进阶教程
  13. 锂电池是什么材料做的
  14. 新中大怎么修改服务器,新中大软件服务器地址修改
  15. Windows 开机自动拨号上网
  16. js正则校验 统一社会信用代码
  17. 重新安装opencv,踩坑。
  18. 【Java-Java集合】Java集合详解与区别
  19. 傻瓜式解决pycrypto安装错误
  20. 2018年全国多校算法寒假训练营练习比赛(第五场)F-The Biggest Water Problem

热门文章

  1. 蓝桥杯:第九届—“彩灯控制器”
  2. vue解决火狐浏览器滚动条问题
  3. 计算机网络 lab2 Ethernet
  4. kitti数据集评估文档
  5. 微信小程序踩坑之旅(三):不同机型布局适配问题(rpx,px,vh,vw)
  6. 舒舍 舍友的北漂租房故事
  7. 手机照片局部放大镜_揭秘“网红大片”里的“骗局”!用手机就能惊艳朋友圈...
  8. 计算机应用基础评价手册怎么填,《评价手册》填写说明(必填)
  9. Navicat使用方法
  10. 根据经纬度计算范围_高考地理地理计算专题