这是一个简单使用golang配置文件库的记录,如果有问题,欢迎指出
一、Viper
viper 是一个完整的 Go应用程序的配置解决方案,它被设计为在应用程序中工作,并能处理所有类型的配置需求和格式。
go get github.com/spf13/viper
viper支持特性功能如下:
设置默认值
读取 JSON、TOML、YAML、HCL、envfile和 Java属性的配置文件
监控配置文件改动,并热加载配置文件
从环境变量中读取
从远程配置中心读取配置(etcd/consul),并监控变动
从命令行标志中读取
从缓冲区读取
支持直接设置配置项的值
viper读取配置文件的优先级顺序:
viper.Set() 所设置的值
命令行 flag
环境变量
配置文件
配置中心etcd/consul
默认值
注意:viper的配置键不区分大小写的
简单配置:
这里我的配置文件夹为conf,配置文件格式为ini文件
Config = viper.New() //初始话一个viper.viper对象
Config.AddConfigPath("conf")
Config.SetConfigName("app")
Config.SetConfigType("ini")
if err := Config.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
fmt.Println("找不到配置文件")
} else {
fmt.Println("配置文件出错")
}
}
Config.WatchConfig() //监控配置文件并且热加载程序,不重启就可以加载新的配置文件
Config.OnConfigChange(func(in fsnotify.Event) {
log.Printf("Config file changed: %s", in.Name)
})
读取配置属性:
读取属性需要调用对象viper的方法来获取不同类型的配置属性,例如:
HTTPPort = Config.GetInt("HTTP_PORT")
ReadTimeout = Config.GetDuration("READ_TIMEOUT")
WriteTimeout = Config.GetDuration("WRITE_TIMEOUT")
读取之后就可以在别的模块内调用配置模块里的viper对象来获取对应的配置信息了
二、go-ini
go-ini是一个非常方便、高效的go配置文件操作库。
github.com/go-ini/ini
go-ini的多个配置项通过分区(section)来划分。有默认(空)分区和命名的分区,没有给分区命名就是默认分区,默认分区必须写在任何一个命名分区的上边。每个配置项通过换行来区分。
读取ini文件配置项
直接使用ini.Load(配置文件路径) 就可以了,返回一个配置文件结构体和错误信息
cfgs, err := ini.Load("conf/go-conf.ini")
if err != nil {
fmt.Println(err)
}
随后通过分区方法来选择分区读取数据
val := cfgs.Section("kafka").Key("address").Value()
// cfgs.Section()选择一个分区,返回分区的结构体指针
// Key()是分区结构体的一个方法,读取分区的配置项,返回一个键的结构体指针
如果要读取默认分区的话section为空就可以了
读取到的数据可以转换为多种类型,
val := cfgs.Section("").Key("a").Value() //直接返回
val,err := cfgs.Section("").Key("a").Int() //转换为int之后返回
还可以定义结构体来存放配置,直接将配置映射到结构体里
type KafkaConfig struct {
// ini用于给ini库做标识
Address string `ini:"address"`
}
type TailConfig struct {
Path string `ini:"path"`
Filename string `ini:"fileName"`
// 如果是结构体,则指明分区名。其他指明配置项即可
Children `ini:"tailfile.children"`
}
type Children struct {
Name string `ini:"name"`
}
type Config struct {
KafkaConfig `ini:"kafka"`
TailConfig `ini:"tailfile"`
}
func main() {
// 先实例化结构体,将指针传入MapTo方法中
var cfg = new(Config)
err := ini.MapTo(cfg, "./conf/go-conf.ini")
if err != nil {
fmt.Print(err)
}
// 取最深的配置项
fmt.Println(cfg.TailConfig.Children.Name)
}
然后就可以获取配置信息来使用了.
~⊙o⊙