go配置解析库 - viper

简介: go配置解析库 - viper

简介

viper 是一个配置解决方案,拥有丰富的特性:

  • 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件;
  • 可以设置监听配置文件的修改,修改时自动加载新的配置;
  • 从环境变量、命令行选项和io.Reader中读取配置;
  • 从远程配置系统中读取和监听修改,如 etcd/Consul;
  • 代码逻辑中显示设置键值。

获取

$ go get github.com/spf13/viper

读取配置

viper读入配置有如下读入方式:

  • 设置默认的配置名
  • 读取配置文件
  • 监听和重新读取配置文件
  • 从io.Reader读取配置
  • 从环境变量读取
  • 从命令行标志读取
  • 从远程Key/Value存储读取

读取顺序

  1. 从默认的设置中读取
  2. 从pflag中读取
  3. 从环境变量中读取
  4. 从配置文件中读取
  5. 从KV存储中读取
  6. 从默认的配置文件中读取

其API如下,这里我将其进行分组

在这里插入图片描述

AddConfigPath

func AddConfigPath(in string)

添加文件的搜索路径

AddRemoteProvider

func AddRemoteProvider(provider, endpoint, path string) error

添加远程源,当前支持etcd、consul、firestore

  • provider:etcd、consul、firestore
  • endpoint:连接地址

    • etcd为http: //ip:port
    • consul为ip:port
  • path从kv存储中检索配置的路径,例如要从/configs/myapp.json检索名为myapp.json的配置文件则应该设置为/config并将配置名(SetConfigName)设置为myapp

AddSecureRemoteProvider

func AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error

添加远程源,当前支持etcd、consul、firestore

  • provider:etcd、consul、firestore
  • endpoint:连接地址

    • etcd为http: //ip:port
    • consul为ip:port
  • path从kv存储中检索配置的路径,例如要从/configs/myapp.json检索名为myapp.json的配置文件则应该设置为/config并将配置名(SetConfigName)设置为myapp
  • secretkeyring:密钥路径

AllKeys

func AllKeys() []string

返回所有的键。

AllSettings

func AllSettings() map[string]interface{}

将所有键值对返回

AllowEmptyEnv

func AllowEmptyEnv(allowEmptyEnv bool)

是否允许空的环境变量视为有效值,默认是false

AutomaticEnv

func AutomaticEnv()

开启环境变量检查是否匹配现有键值,如果匹配则加载。

BindEnv

func BindEnv(input ...string) error

将环境变量的值设置到viper键中,该函数可以提供一或两个参数。

  • 只提供一个参数: 默认环境变量与该简直名称相同。
  • 提供两个参数:第一个参数是键,第二个参数是环境变量名称。

例如:

//假设配置文件中设置了值为192.168.3.244
fmt.Println(viper.GetString("mysql.ip")) // 192.168.3.244
// 绑定环境变量,假设我们设置mysql.ip=127.0.0.1、MYSQL.IP=localhost
viper.BindEnv("mysql.ip")//127.0.0.1是调用os.LookupEnv获取的值
fmt.Println(viper.GetString("mysql.ip"))

BindFlagValue

func BindFlagValue(key string, flag FlagValue) error

将键同flag绑定

BindFlagValues

func BindFlagValues(flags FlagValueSet) error

绑定flag集合

BindPFlag

func BindPFlag(key string, flag *pflag.Flag) error

绑定pflag

BindPFlags

func BindPFlags(flags *pflag.FlagSet) error

绑定pflag集合

ConfigFileUsed

func ConfigFileUsed() string

返回正在使用的配置文件,例如:

D:\workspace\myOpenSource\go-example\viper\ini\config.ini

Debug

func Debug()

打印调试信息,会根据viper查找顺序打印配置信息。例如:

Aliases:
map[string]string{}
Override:
map[string]interface {}{}
PFlags:
map[string]viper.FlagValue{}
Env:
map[string][]string{}
Key/Value Store:
map[string]interface {}{}
Config:
map[string]interface {}{"mysql.database":"awesome", "mysql.ip":"127.0.0.1", "mysql.password":"123456", "mysql.port":"3306", "mysql.user":"dj", "redis.ip":"127.0.0.1", "redis.port":"7381"}
Defaults:
map[string]interface {}{}

Get

获取指定key值信息

func Get(key string) interface{}
func GetBool(key string) bool
func GetDuration(key string) time.Duration
func GetFloat64(key string) float64
func GetInt(key string) int
func GetInt32(key string) int32
func GetInt64(key string) int64
func GetIntSlice(key string) []int
func GetSizeInBytes(key string) uint
func GetString(key string) string
func GetStringMap(key string) map[string]interface{}
func GetStringMapString(key string) map[string]string
func GetStringMapStringSlice(key string) map[string][]string
func GetStringSlice(key string) []string
func GetTime(key string) time.Time
func GetUint(key string) uint
func GetUint32(key string) uint32
func GetUint64(key string) uint64

InConfig

func InConfig(key string) bool

判断这个键是否存在。

fmt.Println(viper.InConfig("mysql"))    //false
fmt.Println(viper.InConfig("ip"))       //false
fmt.Println(viper.InConfig("mysql.ip")) //true

InSet

func IsSet(key string) bool

判断键是否是个集合

MergeConfig

func MergeConfig(in io.Reader) error
func MergeConfigMap(cfg map[string]interface{}) error
func MergeInConfig() error

会将新的配置和原有的配置合并

OnConfigChang

func OnConfigChange(run func(in fsnotify.Event))

设置配置改变时的回调函数

ReadConfig

func ReadConfig(in io.Reader) error

从IO接口中读取配置

ReadInConfig

func ReadInConfig() error

加载配置文件

ReadRemoteConfig

func ReadRemoteConfig() error

加载远程配置文件

RegisterAlias

func RegisterAlias(alias string, key string)

为key设置一个别名。

Reset

func Reset()

将存储的所有信息清空,仅用于测试

SafeWriteConfig

func SafeWriteConfig() error

仅当文件不存在时,将当前配置写入文件

SafeWriteConfigAs

func SafeWriteConfigAs(filename string) error

将当前配置写入给定文件名(如果它不存在)。

Set

func Set(key string, value interface{})

覆盖内存中的键的值,对键不区分大小写。将用于代替通过flag、配置文件、环境变量、默认值或键/值存储获得的值。

SetConfigFile

func SetConfigFile(in string)

明确定义配置文件的路径、名称和扩展名。Viper 将使用它而不检查任何配置路径。

SetConfigName

func SetConfigName(in string)

设置配置文件的名称。不包括扩展名。

SetConfigPermissions

func SetConfigPermissions(perm os.FileMode)

设置给定配置文件的权限

SetConfigType

func SetConfigType(in string)

设置配置文件的类型,如json、ini、toml

SetDefault

func SetDefault(key string, value interface{})

为指定的键设置默认值,对key不区分大小写,仅当用户没有通过flag、配置文件以及环境变量设置值时才使用默认值。

SetEnvKeyReplacer

func SetEnvKeyReplacer(r *strings.Replacer)

允许你使用一个strings.Replacer对象来将配置名重写为Env名。如果你想在Get()中使用包含-的配置名 ,但希望对应的环境变量名包含_分隔符,就可以使用该方法。使用它的一个例子可以在项目中viper_test.go文件里找到。

func TestSetEnvKeyReplacer(t *testing.T) {
    Reset()

    AutomaticEnv()

    testutil.Setenv(t, "REFRESH_INTERVAL", "30s")

    replacer := strings.NewReplacer("-", "_")
    SetEnvKeyReplacer(replacer)

    assert.Equal(t, "30s", Get("refresh-interval"))
}

SetEnvPrefix

func SetEnvPrefix(in string)

定义环境变量使用的前缀。

SetEnvPrefix("spf") // 将会自动转为大写
BindEnv("id")
 
os.Setenv("SPF_ID", "13") // 通常通过系统环境变量来设置
 
id := Get("id") // 13

SetFs

func SetFs(fs afero.Fs)

设置文件系统。github.com/spf13/afero

SetTypeByDefaultValue

func SetTypeByDefaultValue(enable bool)

使用 Get 函数时基于键的默认值而不是基于正常获取逻辑返回的值启用或禁用键值类型的推断。
例如,如果一个键的默认值为 []string{},并且通过环境变量将相同的键设置为“ab c”,则调用 Get 函数将返回该键的字符串切片,如果该键的类型由默认值推断,Get 函数将返回:

[]string {"a", "b", "c"}

否则返回

"a b c"

Unmarshal

func Unmarshal(rawVal interface{}, opts ...DecoderConfigOption) error

将配置解组到 Struct。确保正确设置结构字段上的标签。

UnmarshalExact

func UnmarshalExact(rawVal interface{}, opts ...DecoderConfigOption) error

UnmarshalExact 将配置解组为 Struct,如果目标结构中不存在字段,则会出错。

UnmarshalKey

func UnmarshalKey(key string, rawVal interface{}, opts ...DecoderConfigOption) error

UnmarshalKey 采用单个键并将其解组为 Struct。

WatchConfig

func WatchConfig()

监控配置

WatchRemoteConfig

func WatchRemoteConfig() error

WriteConfig

func WriteConfig() error

WriteConfigAs

func WriteConfigAs(filename string) error

WriteConfigAs 将当前配置写入给定的文件名。

相关文章
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
2251 103
|
11月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
1176 0
|
9月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
711 43
Go语言深度解析:从入门到精通的完整指南
|
域名解析 应用服务中间件 Shell
使用nps配置内网穿透加域名解析
使用nps配置内网穿透加域名解析
1289 77
|
10月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
存储 设计模式 安全
Go 语言单例模式全解析:从青铜到王者段位的实现方案
单例模式确保一个类只有一个实例,并提供全局访问点,适用于日志、配置管理、数据库连接池等场景。在 Go 中,常用实现方式包括懒汉模式、饿汉模式、双重检查锁定,最佳实践是使用 `sync.Once`,它并发安全、简洁高效。本文详解各种实现方式的优缺点,并提供代码示例与最佳应用建议。
429 5
|
11月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
781 0
|
11月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
597 11
|
Go
【LeetCode 热题100】155:最小栈(详细解析)(Go语言版)
本文详细解析了力扣热题155:最小栈的解题思路与实现方法。题目要求设计一个支持 push、核心思路是使用辅助栈法,通过两个栈(主栈和辅助栈)来维护当前栈中的最小值。具体操作包括:push 时同步更新辅助栈,pop 时检查是否需要弹出辅助栈的栈顶,getMin 时直接返回辅助栈的栈顶。文章还提供了 Go 语言的实现代码,并对复杂度进行了分析。此外,还介绍了单栈 + 差值记录法的进阶思路,并总结了常见易错点,如 pop 操作时忘记同步弹出辅助栈等。
488 6

热门文章

最新文章

推荐镜像

更多
  • DNS