golang读取配置文件和环境变量的轻量级插件库fig的使用
Golang读取配置文件和环境变量的轻量级插件库fig的使用
fig是一个用于将应用程序配置加载到Go结构体中的小型库。
为什么选择fig?
- 🛠️ 可以在单个结构体中定义配置、验证和默认值
- 🌍 轻松从文件、环境变量或两者加载配置
- ⏰ 将字符串解码为
Time
、Duration
、Regexp
或任何实现StringUnmarshaler
接口的自定义类型 - 🗂️ 兼容
yaml
、json
和toml
文件格式 - 🧩 仅三个外部依赖项
快速开始
安装fig:
$ go get -d github.com/kkyr/fig
示例配置
- 首先定义一个YAML配置文件:
# config.yaml
build: "2020-01-09T12:30:00Z"
server:
ports:
- 8080
cleanup: 1h
logger:
level: "warn"
trace: true
- 然后定义对应的Go结构体:
package main
import (
"fmt"
"time"
"regexp"
"github.com/kkyr/fig"
)
type Config struct {
Build time.Time `fig:"build" validate:"required"` // 必须字段
Server struct {
Host string `fig:"host" default:"127.0.0.1"` // 默认值为127.0.0.1
Ports []int `fig:"ports" default:"[80,443]"` // 默认端口80和443
Cleanup time.Duration `fig:"cleanup" default:"30m"` // 默认30分钟
}
Logger struct {
Level string `fig:"level" default:"info"` // 默认日志级别info
Pattern *regexp.Regexp `fig:"pattern" default:".*"` // 默认正则表达式.*
Trace bool `fig:"trace"` // 无默认值
}
}
func main() {
var cfg Config
err := fig.Load(&cfg) // 加载配置
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", cfg)
// 输出: {Build:2019-12-25T00:00:00Z Server:{Host:127.0.0.1 Ports:[8080] Cleanup:1h0m0s} Logger:{Level:warn Pattern:.* Trace:true}}
}
标记为required
的字段会被检查是否为空,而default
值会被应用到那些为空的字段上。
环境变量支持
默认情况下,fig只会从配置文件中查找值。要同时包含环境变量的值,可以使用UseEnv
选项:
fig.Load(&cfg, fig.UseEnv("APP_PREFIX")) // 使用APP_PREFIX作为环境变量前缀
如果存在冲突,环境变量的值将优先于配置文件中的值。
完整示例
下面是一个完整的示例,展示如何同时使用配置文件和环境变量:
package main
import (
"fmt"
"log"
"os"
"time"
"github.com/kkyr/fig"
)
type Config struct {
App struct {
Name string `fig:"name" default:"myapp"` // 默认应用名
Version string `fig:"version" validate:"required"` // 必须字段
}
Server struct {
Host string `fig:"host" default:"localhost"` // 默认主机
Port int `fig:"port" default:"8080"` // 默认端口
}
Timeout time.Duration `fig:"timeout" default:"30s"` // 默认超时30秒
}
func main() {
// 设置环境变量(实际使用时应在系统环境变量中设置)
os.Setenv("APP_SERVER_HOST", "0.0.0.0")
os.Setenv("APP_SERVER_PORT", "9000")
var cfg Config
err := fig.Load(&cfg,
fig.File("config.yaml"), // 指定配置文件
fig.UseEnv("APP"), // 使用APP作为环境变量前缀
fig.Dirs(".", "/etc/myapp"), // 搜索配置文件的目录
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", cfg)
// 输出将显示环境变量中的Host和Port覆盖了配置文件中的值
}
这个示例展示了fig的主要功能:
- 从YAML文件加载配置
- 支持环境变量覆盖
- 支持默认值和必填验证
- 支持多目录搜索配置文件
fig是一个简单但功能强大的配置加载库,特别适合需要同时支持配置文件和环境变量的Go应用程序。
更多关于golang读取配置文件和环境变量的轻量级插件库fig的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang读取配置文件和环境变量的轻量级插件库fig的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用fig库读取配置文件和环境变量
fig是一个轻量级的Go配置库,支持从配置文件和环境变量中读取配置,具有简洁的API和良好的默认值支持。下面我将详细介绍fig的使用方法。
安装fig
首先安装fig库:
go get github.com/kkyr/fig
基本用法
1. 从配置文件加载配置
假设我们有一个配置文件config.yaml
:
server:
host: "localhost"
port: 8080
timeout: 30s
database:
url: "postgres://user:pass@localhost:5432/db"
pool: 10
debug: true
对应的Go结构体:
type Config struct {
Server struct {
Host string `fig:"host" default:"0.0.0.0"`
Port int `fig:"port" validate:"required"`
Timeout time.Duration `fig:"timeout"`
}
Database struct {
URL string `fig:"url" validate:"required"`
Pool int `fig:"pool" default:"5"`
}
Debug bool `fig:"debug"`
}
加载配置的代码:
package main
import (
"fmt"
"log"
"time"
"github.com/kkyr/fig"
)
func main() {
var cfg Config
// 从当前目录加载config.yaml
err := fig.Load(&cfg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", cfg)
}
2. 自定义配置选项
fig提供了多种自定义选项:
err := fig.Load(&cfg,
fig.File("app.json"), // 指定文件名
fig.Dirs(".", "config", "/etc/myapp"), // 搜索目录
fig.UseEnv("MYAPP"), // 环境变量前缀
fig.Tag("json"), // 使用json标签
)
3. 环境变量支持
fig可以自动从环境变量读取配置,环境变量名遵循以下规则:
- 对于嵌套字段:
PREFIX_PARENT_CHILD
- 数组/切片:
PREFIX_FIELD_0
,PREFIX_FIELD_1
等
type Config struct {
Host string `fig:"host" env:"HOST"` // 显式指定环境变量名
Port int `fig:"port"` // 自动转换为PORT
}
设置环境变量后加载:
export MYAPP_HOST=example.com
export MYAPP_PORT=3000
err := fig.Load(&cfg, fig.UseEnv("MYAPP"))
4. 验证配置
fig支持简单的验证:
type Config struct {
Port int `fig:"port" validate:"required,min=1,max=65535"`
}
完整示例
下面是一个完整的示例,展示fig的各种功能:
package main
import (
"fmt"
"log"
"time"
"github.com/kkyr/fig"
)
type Config struct {
App struct {
Name string `fig:"name" default:"myapp"`
Version string `fig:"version" default:"1.0.0"`
}
Server struct {
Host string `fig:"host" default:"0.0.0.0"`
Port int `fig:"port" validate:"required"`
Timeout time.Duration `fig:"timeout" default:"30s"`
}
Database struct {
URL string `fig:"url" validate:"required"`
Pool int `fig:"pool" default:"5"`
}
Debug bool `fig:"debug" default:"false"`
}
func main() {
var cfg Config
// 从config.yaml加载配置,支持环境变量
err := fig.Load(&cfg,
fig.File("config.yaml"),
fig.Dirs(".", "config"),
fig.UseEnv("APP"),
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("App Name: %s\n", cfg.App.Name)
fmt.Printf("Server Host: %s\n", cfg.Server.Host)
fmt.Printf("Server Port: %d\n", cfg.Server.Port)
fmt.Printf("Database URL: %s\n", cfg.Database.URL)
fmt.Printf("Debug Mode: %v\n", cfg.Debug)
}
支持的配置文件格式
fig支持多种配置文件格式:
- YAML (.yml, .yaml)
- JSON (.json)
- TOML (.toml)
- HCL (.hcl)
最佳实践
- 配置结构设计:使用嵌套结构体组织配置,保持与配置文件结构一致
- 默认值:为所有字段设置合理的默认值
- 环境变量:生产环境优先使用环境变量
- 验证:添加必要的验证规则
- 多环境配置:使用不同的配置文件或环境变量区分环境
fig是一个简单但功能齐全的配置库,适合大多数Go应用程序的配置管理需求。它的轻量级设计和灵活的选项使其成为许多项目的理想选择。