golang下的viper包的简单使用方式

 更新时间:2023年06月12日 09:56:22   作者:imthefaker  
这篇文章主要介绍了golang下的viper包的简单使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

golang下viper包的简单使用

Viper 是一个完整的 Go 应用程序配置解决方案,它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式

使用viper并不复杂,在不生成实例的情况下,viper使用默认的实例才缓存配置信息,如果你不想这么做,可以使用viper.New()方法来生成自己的实例,直接上代码

package main
import (
	"bytes"
	"fmt"
	"github.com/spf13/viper"
)
func main() {
	viper.SetDefault("ContentDir", "content")
	viper.SetDefault("LayoutDir", "layouts")
	viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
	/**
		viper.SetDefault会设置默认参数,也就是说,每次读取文件后,这些参数都会读取到viper的缓存中,
        并且在使用viper提供的方法写文件时,也会一同写进去,当使用Set方法后,默认值将会被覆盖
	**/
	viper.SetConfigName("config")  // 这里设置要读取文件的名称
	viper.SetConfigType("yaml")    // 这里设置要读取文件的类型
	viper.AddConfigPath(".")       // 这里设置读取文件的文件夹路径,可以设置多个路径,将会依次从这几个路径中去寻找config.yaml文件
	viper.AddConfigPath("./test3") // 设置的第二个备选路径
	viper.AddConfigPath("./test")  // 设置的最后一个备选路径
	err := viper.ReadInConfig() // ReadInConfig用于读取查找到的配置文件
	if err != nil {
		panic(fmt.Errorf("fatal error config file: %w", err)) // 返回失败信息,可能由于文件不存在等
	}
	viper.Set("newconf", true) // 设置新参数,上面讲述了Set和SetDefault的区别,这里不再赘述
	viper.WriteConfig()
	viper.SafeWriteConfig()
	viper.WriteConfigAs("./test2/config.yaml")
	viper.SafeWriteConfigAs("./test2/config.yaml")
	/**
		WriteConfig用于将配置信息写入新的配置文件中,新文件的名称和后缀采用使用第20,21行所设置的SetConfigName("config")
		和viper.SetConfigType("yaml")。WriteConfigAs可以指定新的配置文件的路径(带有文件名的路径),
		而WriteConfig则写入你所定义的第一个AddConfigPath,即第22行:“ viper.AddConfigPath(".") ”
		方法名带有Safe的则代表如果文件已经存在,则会报错。不带有Safe的方法在文件已经存在时会覆盖文件。
		这里将会把第11,12,13行和第31行设置的参数连同config.yaml文件原本的参数一同写入到新文件中
	**/
	var yamlExample = []byte(`
Hacker: true
name: steve
hobbies:
- skateboarding
- snowboarding
- go
clothing:
jacket: leather
trousers: denim
age: 35
eyes : brown
beard: true
`)
	viper.SetConfigType("yaml")
	viper.ReadConfig(bytes.NewBuffer(yamlExample))
	x := viper.GetString("name")
	y := viper.Get("name")
	fmt.Println(x)
	fmt.Println(y)
	/**
		除了从文件中读取配置信息以外,也可以从字节流中读取,如上所示,GetString方法返回key所对应的字符串类型的value,
		同样你也可以使用GetInt,GetBool等等,Get方法返回一个接口,因此它可以适用于所有的类型。
	**/
	viper.RegisterAlias("loud", "Verbose")
	viper.Set("verbose", true)
	viper.Set("loud", true)
	viper.GetBool("loud")
	viper.GetBool("verbose")
	/**
		RegisterAlias用于注册别名,也就意味着你接下来的所有关于loud的操作都可以用vervose来代替,
		但他只作为你程序运行过程中一个方便使用的别名,其所表达的配置信息中不含有verbose这一属性,
		也就是说最终你写入新配置文件时,verbose将不会出现
		最后注意!!!:在vaper中,配置信息的key是不区分大小写的,因此上方的Verbose和verbose等同
	**/
    viper.AutomaticEnv()
	// 读取环境变量
	viper.SetEnvPrefix("CGO")
	/** 设置环境变量前缀:CGO_,如果是cgo,将自动转变为大写。
		这样在使用get读取环境变量时可以只读取与项目有关的配置
	**/
	viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
	// 将viper.Get(key) key字符串中'.'和'-'替换为'_',
	// 这使得使用Get获取值的时候可以使用其他符号来代替_
	viper.BindEnv("ENABLED")                  // 将"CGO_ENABLED"绑定到"ENABLED"
	viper.BindEnv("enabled")                  // 匹配环境变量时自动转换为大写,但key仍然是小写
	viper.BindEnv("user.secret-id", "GOROOT") // 当含有两个参数时,前缀不会生效
	viper.BindEnv("PATH", "PATH")
	fmt.Println(viper.Get("user.secret-id"))
	fmt.Println(viper.GetString("ENABLED"))
	fmt.Println(viper.GetString("enabled"))
	fmt.Println(viper.GetString("PATH"))
	// viper在读取环境变量时是区分大小写的
}

golang常用库viper解读

1. viper的介绍

viper是go一个配置解决方案的库。

  • 支持各种配置文件,如JSON,TOML, YAML, HCL, envfile和Java属性配置文件
  • 支持监听文件变化以及重新读取配置
  • 支持从环境变量读取配置
  • 支持从远程配置系统(etcd或Consul)读取配置,并能监听远程配置修改
  • 支持从命令行标志Flag读取配置,比如搭配cobra使用

viepr直接使用go get命令安装即可

$ go get github.com/spf13/viper

2.viper的使用

//加载本地配置
func InitInFromLocal() (*viper.Viper, error) {
	home := "./config"
	var v = viper.New()
	//cobra.CheckErr(err)
	fmt.Printf("UserHomeDir", home)
	// Search config in home directory with name ".cobra" (without extension).
	v.AddConfigPath(home)
	v.SetConfigType("toml")
	v.SetConfigName("pro")
	v.AutomaticEnv()
	if err := v.ReadInConfig(); err == nil {
		fmt.Println("Using config file success:", v.ConfigFileUsed())
	} else {
		fmt.Println("Using config file:%s", err)
	}
	fmt.Println(v.GetString("app_name_pro"))
	return v, nil
}
//加载远端配置
func InitConfigFromRemote() error {
	// 远程配置
	viper.AddRemoteProvider("etcd", "http://127.0.0.1:2379", "config/app.yml")
	//v.SetConfigType("json")
	viper.SetConfigFile("app.yml")
	viper.SetConfigType("yml")
	if err := viper.ReadRemoteConfig(); err == nil {
		log.Printf("use config file -> %s\n", viper.ConfigFileUsed())
	} else {
		return err
	}
	return nil
}
//设置默认值
	viper.SetDefault("email", "NAME HERE <EMAIL ADDRESS>")
	viper.SetDefault("license", "apache")
//绑定单个值cobra
	viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
	viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
//绑定多个值
	viper.BindPFlags(rootCmd.PersistentFlags())
//获取环境变量
    v.AutomaticEnv()
	v.AllowEmptyEnv(true)
	v.SetEnvPrefix("CK")
//监听文件变化
// 监听到文件变化后的回调
v.OnConfigChange(func(e fsnotify.Event) {
  fmt.Println("Config file changed:", e.Name)
  fmt.Println(v.Get("db.redis.passwd"))
})
v.WatchConfig()
//从viper写入文件
	viper.SetConfigFile("./hello.yml")
	viper.WriteConfig()
//获取子配置项
    viper.Sub("db")

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • go语言中的面向对象

    go语言中的面向对象

    Go不支持类,而是提供了结构体。结构体中可以添加属性和方法。这样可以将数据和操作数据的方法绑定在一起,实现与类相似的效果。这篇文章介绍了go语言中的面向对象,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Golang实现自己的orm框架实例探索

    Golang实现自己的orm框架实例探索

    这篇文章主要为大家介绍了Golang实现自己的orm框架实例探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言之使用pprof工具查找goroutine(协程)泄漏

    Go语言之使用pprof工具查找goroutine(协程)泄漏

    这篇文章主要介绍了Go语言之使用pprof工具查找goroutine(协程)泄漏,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 深入详解如何使用Go实现端口扫描器

    深入详解如何使用Go实现端口扫描器

    这篇文章主要为大家详细介绍了深如何使用Go语言实现一个简单的端口扫描器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-11-11
  • Go错误处理之errors包全面解析与最佳实践

    Go错误处理之errors包全面解析与最佳实践

    标准库errors包是Go提供的基础错误处理工具,它不仅允许我们创建和包装错误,还支持丰富的功能,下面小编将从基础到高级,带你深入掌握 errors 包的使用,快跟随小编一起学习起来吧
    2026-03-03
  • Go学习笔记之Zap日志的使用

    Go学习笔记之Zap日志的使用

    这篇文章主要为大家详细介绍了Go语言中Zap日志的使用以及安装,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-07-07
  • 一文详解Golang内存管理之栈空间管理

    一文详解Golang内存管理之栈空间管理

    这篇文章主要介绍了Golang内存管理的栈空间管理,文章通过代码示例介绍的非常详细,对我们学习Golang内存管理有一定的帮助,需要的朋友跟着小编一起来学习吧
    2023-06-06
  • 浅谈go build后加文件和目录的区别

    浅谈go build后加文件和目录的区别

    这篇文章主要介绍了浅谈go build后加文件和目录的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang中指针的使用详解

    Golang中指针的使用详解

    Golang是一门支持指针的编程语言,指针是一种特殊的变量,存储了其他变量的地址。通过指针,可以在程序中直接访问和修改变量的值,避免了不必要的内存拷贝和传递。Golang中的指针具有高效、安全的特点,在并发编程和底层系统开发中得到广泛应用
    2023-04-04
  • Go语言如何并发超时处理详解

    Go语言如何并发超时处理详解

    大家都知道golang并没有在语言层次上提供超时操作,但可以通过一些小技巧实现超时。下面来一起看看吧,有需要的朋友们可以参考借鉴。
    2016-09-09

最新评论