当前位置: 首页 > 工具软件 > go-conf > 使用案例 >

Golang 配置文件库 Viper和ini

聂迪
2023-12-01

Golang 配置文件库 Viper和ini

这是一个简单使用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⊙

 类似资料: