go配置管理vpier

go配置管理vpier
安安go配置管理viper
Viper 提供了丰富的 API 来处理配置管理的各种场景,下面详细讲解其常用 API 及核心功能:
安装
1 | go get github.com/spf13/viper |
简介
Viper,直译为眼镜蛇,是一个针对 go 应用程序的完整的配置文件解决方案,可以处理几乎所有类型的配置需求和格式,方便管理项目的配置文件,并且具有以下特色:
- 默认值设置
- 支持格式 JSON, TOML, YAML, HCL, envfile,Java properties
- 支持实时监测和重载配置文件
- 支持环境变量中读取
- 支持远程配置系统读取配置并监测变化
- 支持读取命令行标记
- 支持缓冲区读取
- 支持显示设置值
一、常用 API 及功能详解
1. 配置读取相关 API
Get(key string) interface{}:获取任意类型的配置值GetString(key string) string:获取字符串类型GetInt(key string) int:获取整数类型GetBool(key string) bool:获取布尔类型GetFloat64(key string) float64:获取浮点类型GetStringSlice(key string) []string:获取字符串切片GetIntSlice(key string) []int:获取整数切片GetStringMap(key string) map[string]interface{}:获取嵌套的 mapIsSet(key string) bool:检查配置项是否存在
示例:
1 | name := viper.GetString("app.name") |
2. 配置设置相关 API
Set(key string, value interface{}):设置配置值(内存中)SetDefault(key string, value interface{}):设置默认值(未找到配置时使用)
示例:
1 | // 设置默认值 |
3. 配置文件操作 API
读取配置文件:
SetConfigName(name string):设置配置文件名(不带扩展名)SetConfigType(ext string):设置配置文件类型(如 “yaml”、”json”)AddConfigPath(path string):添加配置文件搜索路径ReadInConfig() error:加载配置文件
示例:
1
2
3
4
5
6
7
8viper.SetConfigName("app") // 配置文件名为 app.yaml
viper.SetConfigType("yaml")
viper.AddConfigPath(".") // 当前目录
viper.AddConfigPath("/etc/app") // 系统目录
if err := viper.ReadInConfig(); err != nil {
log.Fatalf("无法读取配置文件: %v", err)
}写入配置文件:
WriteConfig() error:写入当前配置到配置文件(覆盖原有内容)SafeWriteConfig() error:仅当文件不存在时写入(避免覆盖)WriteConfigAs(filename string) error:写入配置到指定文件
示例:
1
2
3
4
5
6
7
8
9
10
11
12// 修改配置
viper.Set("server.port", 9090)
// 写入到原有配置文件
if err := viper.WriteConfig(); err != nil {
log.Fatal(err)
}
// 写入到新文件
if err := viper.WriteConfigAs("app_backup.yaml"); err != nil {
log.Fatal(err)
}
4. 环境变量与命令行相关 API
AutomaticEnv():自动绑定环境变量SetEnvPrefix(prefix string):设置环境变量前缀SetEnvKeyReplacer(replacer *strings.Replacer):替换环境变量中的分隔符BindEnv(input ...string):手动绑定环境变量到配置项BindPFlags(flags *pflag.FlagSet):绑定命令行参数
示例:
1 | // 环境变量前缀为 "MYAPP",自动绑定 |
5. 配置监测与重载 API
WatchConfig():监听配置文件变化OnConfigChange(func(e fsnotify.Event)):注册配置变化回调函数
示例:
1 | // 监听配置文件 |
6. 别名与嵌套分隔符 API
RegisterAlias(alias, key string):为配置项注册别名SetKeyDelimiter(delimiter string):设置嵌套配置的分隔符(默认是.)
示例:
1 | // 注册别名:通过 "addr" 也能访问 "server.address" |
7. 子结构提取 API
Sub(key string) *viper.Viper:提取子配置结构,返回一个新的 Viper 实例
示例:
1 | # 配置文件内容 |
1 | // 提取 database.mysql 子结构 |
8. 序列化与反序列化 API
Unmarshal(rawVal interface{}) error:将配置反序列化为结构体UnmarshalKey(key string, rawVal interface{}) error:将指定 key 的配置反序列化为结构体AllSettings() map[string]interface{}:获取所有配置并序列化为 map
示例:
1 | // 定义结构体 |
二、配置读取顺序(优先级从高到低)
Viper 支持多来源配置,读取顺序如下:
- 手动调用
Set()方法设置的值 - 命令行参数(通过
BindPFlags绑定) - 环境变量
- 配置文件
- 远程配置(如 etcd)
- 调用
SetDefault()设置的默认值
三、核心功能总结
| 功能 | 关键 API |
|---|---|
| 读取配置文件 | ReadInConfig()、AddConfigPath() |
| 写入配置文件 | WriteConfig()、WriteConfigAs() |
| 环境变量处理 | AutomaticEnv()、SetEnvPrefix() |
| 配置监测重载 | WatchConfig()、OnConfigChange() |
| 别名与分隔符 | RegisterAlias()、SetKeyDelimiter() |
| 子结构提取 | Sub() |
| 序列化 / 反序列化 | Unmarshal()、AllSettings() |
[up主专用,视频内嵌代码贴在这]

