golang轻量级配置管理工具插件库store的使用
Golang轻量级配置管理工具插件库store的使用
Store是一个用于Go应用程序的极简配置管理工具。它支持JSON、TOML和YAML格式,并允许你注册任何其他配置格式。
基本使用示例
package main
import (
"log"
"time"
"github.com/tucnak/store"
)
func init() {
// 必须先用一个唯一路径初始化store
store.Init("cats-n-dogs/project-hotel")
}
type Cat struct {
Name string `toml:"naym"`
Clever bool `toml:"ayy"`
}
type Hotel struct {
Name string
Cats []Cat `toml:"guests"`
Opens *time.Time
Closes *time.Time
}
func main() {
var hotel Hotel
// 从TOML文件加载配置
if err := store.Load("hotel.toml", &hotel); err != nil {
log.Println("failed to load the cat hotel:", err)
return
}
// ... 在这里可以修改hotel结构体的值
// 将配置保存回TOML文件
if err := store.Save("hotel.toml", &hotel); err != nil {
log.Println("failed to save the cat hotel:", err)
return
}
}
注册自定义格式
Store支持通过注册系统添加任何其他格式:
// 注册INI格式的编解码器
store.Register("ini", ini.Marshal, ini.Unmarshal)
// 现在可以加载INI格式的配置文件了
err := store.Load("configuration.ini", &object)
// ...
特性说明
- 支持JSON、TOML和YAML格式开箱即用
- 可以轻松注册其他配置格式
- 在Linux上将配置保存在
$XDG_CONFIG_HOME
或$HOME
目录 - 在Windows上将配置保存在
%APPDATA%
目录 - 使用简单直观的API:
Load
和Save
Store是为小型项目设计的轻量级解决方案,避免了像viper这样的复杂配置管理工具的复杂性。
更多关于golang轻量级配置管理工具插件库store的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang轻量级配置管理工具插件库store的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang轻量级配置管理工具插件库store使用指南
store是一个轻量级的Go语言配置管理库,支持多种配置源,包括文件、环境变量、命令行参数等。下面我将详细介绍store库的使用方法。
安装
go get github.com/tucnak/store
基本使用
1. 初始化配置
package main
import (
"fmt"
"github.com/tucnak/store"
)
type Config struct {
Server struct {
Host string `json:"host"`
Port int `json:"port"`
} `json:"server"`
Database struct {
User string `json:"user"`
Password string `json:"password"`
} `json:"database"`
}
func main() {
var config Config
// 设置默认值
config.Server.Host = "localhost"
config.Server.Port = 8080
// 初始化store
err := store.Init("config.json")
if err != nil {
fmt.Println("Failed to initialize store:", err)
return
}
// 加载配置
if err := store.Load(&config); err != nil {
fmt.Println("Failed to load config:", err)
return
}
// 保存配置
if err := store.Save(&config); err != nil {
fmt.Println("Failed to save config:", err)
return
}
fmt.Printf("Config loaded: %+v\n", config)
}
2. 支持多种配置源
store支持多种配置源,可以通过store.Add
方法添加:
// 添加环境变量配置源
store.Add("env", store.NewEnvironment())
// 添加命令行参数配置源
store.Add("flag", store.NewFlag())
// 添加JSON文件配置源
store.Add("json", store.NewJSON("config.json"))
// 添加YAML文件配置源
store.Add("yaml", store.NewYAML("config.yaml"))
// 添加TOML文件配置源
store.Add("toml", store.NewTOML("config.toml"))
3. 配置优先级
配置源按照添加的顺序加载,后添加的配置源会覆盖前面配置源的值:
// 先加载JSON文件
store.Add("json", store.NewJSON("config.json"))
// 然后加载环境变量,环境变量的值会覆盖JSON文件中的值
store.Add("env", store.NewEnvironment())
// 最后加载命令行参数,优先级最高
store.Add("flag", store.NewFlag())
4. 环境变量和命令行参数映射
在结构体中使用store
标签指定环境变量和命令行参数的名称:
type Config struct {
Server struct {
Host string `json:"host" store:"SERVER_HOST"`
Port int `json:"port" store:"SERVER_PORT"`
} `json:"server"`
Database struct {
User string `json:"user" store:"DB_USER"`
Password string `json:"password" store:"DB_PASSWORD"`
} `json:"database"`
}
5. 监听配置变化
store支持监听配置文件变化并自动重新加载:
// 启用监听
store.Watch()
// 设置变化回调
store.OnChange(func() {
fmt.Println("Configuration changed!")
var newConfig Config
if err := store.Load(&newConfig); err == nil {
fmt.Printf("New config: %+v\n", newConfig)
}
})
高级用法
1. 自定义配置源
你可以实现自己的配置源:
type CustomSource struct{}
func (cs *CustomSource) Read(config interface{}) error {
// 实现读取逻辑
return nil
}
func (cs *CustomSource) Write(config interface{}) error {
// 实现写入逻辑
return nil
}
// 使用自定义配置源
store.Add("custom", &CustomSource{})
2. 多文件配置
// 主配置文件
store.Add("json", store.NewJSON("config.json"))
// 本地覆盖配置(如开发环境特定配置)
store.Add("json-local", store.NewJSON("config.local.json"))
3. 配置验证
func validateConfig(c Config) error {
if c.Server.Port <= 0 || c.Server.Port > 65535 {
return fmt.Errorf("invalid port number: %d", c.Server.Port)
}
if c.Database.User == "" {
return errors.New("database user cannot be empty")
}
return nil
}
// 加载时验证
if err := store.Load(&config); err != nil {
// 处理错误
}
if err := validateConfig(config); err != nil {
// 处理验证错误
}
最佳实践
- 配置分层:将配置分为基础配置和环境特定配置
- 敏感信息:不要将密码等敏感信息直接存储在配置文件中,考虑使用环境变量或密钥管理服务
- 默认值:为所有配置项设置合理的默认值
- 文档化:为配置结构体和字段添加注释说明
store库简单易用,适合中小型项目的配置管理需求。对于更复杂的场景,可以考虑使用viper等更强大的配置管理库。