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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: golang读取conf文件的两种方式(ini和Viper)

前言

平时写项目都是习惯于将什么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.1
  port: 3306
  user: "root"
  password: "****"
  dbname: "****"
  max_open_conns: 20
  max_idle_conns: 20
redis:
  host: 127.0.0.1
  port: 6379
  password: ""
  db: 0
  pool_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就适合小型项目的使用就我个人感觉

相关文章
|
7月前
|
存储 Go 数据安全/隐私保护
Golang 语言怎么使用 Viper 管理配置信息?(下)
Golang 语言怎么使用 Viper 管理配置信息?(下)
25 0
|
7月前
|
Unix Go
Golang 语言的标准库 os 包怎么操作目录和文件?
Golang 语言的标准库 os 包怎么操作目录和文件?
28 0
|
2天前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
7 0
|
3天前
|
Go API 开发者
Golang深入浅出之-文件与目录操作:os与path/filepath包
【4月更文挑战第26天】Go语言标准库`os`和`path/filepath`提供文件读写、目录操作等功能。本文涵盖`os.Open`, `os.Create`, `os.Mkdir`, `filepath.Join`等API的使用,强调了文件关闭、路径处理、并发写入和权限问题的处理,并给出实战代码示例,帮助开发者高效、安全地操作文件与目录。注意使用`defer`关闭文件,`filepath`处理路径分隔符,以及通过同步机制解决并发写入冲突。
15 2
|
7月前
|
存储 JSON 监控
Golang 语言怎么使用 Viper 管理配置信息?(上)
Golang 语言怎么使用 Viper 管理配置信息?
24 1
|
4月前
|
Go
golang力扣leetcode 937.重新排列日志文件
golang力扣leetcode 937.重新排列日志文件
27 0
|
4月前
|
Go Windows
golang力扣leetcode 388.文件的最长绝对路径
golang力扣leetcode 388.文件的最长绝对路径
20 0
|
5月前
|
Go
golang使用Viper 库修改yaml的值
看起来你正在使用 Viper 库(可能是 Go 语言中的一个配置管理库),并且希望读取一个配置文件、修改其内容,然后保存为另一个文件。以下是一个简单的示例代码,演示了如何使用 Viper 完成这些任务: ```go package main import ( "fmt" "github.com/spf13/viper" ) func main() { // 设置配置文件路径 viper.SetConfigFile("/root/mongo.conf") // 读取配置文件 err := viper.ReadInConfig() if err != nil { fmt.
|
5月前
|
Go
golang 使用 viper 打印yaml 的值
如果你想指定配置文件路径、读取配置文件并打印所有的键和值,可以使用以下代码: ```go package main import ( "fmt" "github.com/spf13/viper" ) func main() { // 指定配置文件路径 configFilePath := "/root/mongo.conf" viper.SetConfigFile(configFilePath) // 读取配置文件 err := viper.ReadInConfig() if err != nil { fmt.Printf("Error reading config
|
10月前
|
Linux Go Windows
Golang-编译和Go语言文件基本机构
Go语言编译和Go语言文件基本机构
73 0