golang简单配置库支持递归占位符解析插件go-up的使用

Golang简单配置库支持递归占位符解析插件go-up的使用

go-up是一个简单的配置库,支持占位符解析且没有复杂魔法。

主要特性

  • 递归占位符解析
  • 小于10KB
  • 无外部依赖
  • 模块化和可扩展架构

快速开始

  1. 导入go-up库:
import (
	"github.com/ufoscout/go-up"
)
  1. 定义一些属性(可以使用占位符),例如在config.properties中:
# 这是注释行
server.port=9090
server.host=127.0.0.1

# 这里使用占位符,它们将在运行时解析
server.url=http://${server.host}:${server.port}/
  1. 构建一个包含你属性的go-up对象:
ignoreFileNotFound := false 
up, err := NewGoUp().
		AddFile("./confing.properties", ignoreFileNotFound).
		Build();
  1. 通过key查找属性:
port := up.GetIntOrDefault("server.port", 8080); // 返回9090
serverUrl := up.GetString("server.url") // 返回 http://127.0.0.1:9090/
defaultVal := up.GetStringOrDefault("unknown_Key", "defaultValue") // 返回defaultValue

占位符解析示例

go-up支持递归解析占位符。例如:

fileOne.properties:

server.url=http://${${environment}.server.host}:${server.port}
server.port=8080

fileTwo.properties:

environment=PROD
PROD.server.host=10.10.10.10
DEV.server.host=127.0.0.1

Go代码:

up, err := go_up.NewGoUp().
 AddFile("./fileOne.properties", false).
 AddFile("./fileTwo.properties", false).
 Build()

fmt.Println(up.GetString("server.url")) // 打印 'http://10.10.10.10:8080'

默认值

占位符可以有默认值,当key未提供时使用。例如:

config.properties:

# 如果'PORT_NUMBER'未提供,则使用默认值"8080"
server.port=${PORT_NUMBER:8080}
    
# 默认是127.0.0.1
server.ip=${IP:127.0.0.1}

server.url=${server.ip}/${server.port}

Go代码:

up, err := go_up.NewGoUp().
 AddFile("./config.properties", false).
 Build()

// 打印 'http://127.0.0.1:8080'
fmt.Println(up.GetString("server.url")) 

完整示例

package main

import (
	"fmt"
	"os"
	
	go_up "github.com/ufoscout/go-up"
)

func main() {
	// 示例环境变量
	os.Setenv("APP_PREFIX_DB_HOST", "db.example.com")
	
	up, err := go_up.NewGoUp().
		// 加载默认配置文件
		AddFile("./default.properties", false).
		
		// 加载环境变量(带前缀)
		AddReader(go_up.NewEnvReader("APP_PREFIX_", true, true)).
		
		// 设置自定义分隔符
		Delimiters("%(", ")").
		
		// 构建配置对象
		Build()
	
	if err != nil {
		panic(err)
	}
	
	// 获取配置值
	dbHost := up.GetString("db.host")
	dbPort := up.GetIntOrDefault("db.port", 3306)
	
	fmt.Printf("Database connection: %s:%d\n", dbHost, dbPort)
	
	// 使用递归占位符
	appName := up.GetString("app.name")
	appVersion := up.GetString("app.version")
	appFullName := up.GetString("app.fullname") // 可能包含占位符 ${app.name}-${app.version}
	
	fmt.Printf("Application: %s (%s)\n", appFullName, appName)
}

API概览

go-up提供了简单直接的API:

type GoUp interface {
  Exists(key string) bool

  GetBool(key string) bool
  GetBoolOrDefault(key string, defaultValue bool) bool
  GetBoolOrFail(key string) (bool, error)
   
  GetFloat64(key string) float64
  GetFloat64OrDefault(key string, defaultValue float64) float64
  GetFloat64OrFail(key string) (float64, error)
    
  GetInt(key string) int
  GetIntOrDefault(key string, defaultValue int) int
  GetIntOrFail(key string) (int, error)
   
  GetString(key string) string
  GetStringOrDefault(key string, defaultValue string) string
  GetStringOrFail(key string) (string, error)

  GetStringSlice(key string, separator string) []string
  GetStringSliceOrDefault(key string, separator string, defaultValue []string) []string
  GetStringSliceOrFail(key string, separator string) ([]string, error)
}

go-up是一个轻量级的配置解决方案,特别适合需要递归占位符解析和小体积应用的场景。


更多关于golang简单配置库支持递归占位符解析插件go-up的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单配置库支持递归占位符解析插件go-up的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-up 配置库使用指南:支持递归占位符解析

go-up 是一个轻量级的 Go 语言配置库,支持递归占位符解析,非常适合需要灵活配置管理的项目。下面我将详细介绍它的使用方法和特性。

基本特性

  • 支持 JSON、YAML、TOML 等多种格式
  • 支持递归占位符解析(如 ${database.host}
  • 支持环境变量替换
  • 支持多文件合并
  • 简单易用的 API

安装

go get github.com/ufoscout/go-up

基本使用示例

package main

import (
	"fmt"
	"github.com/ufoscout/go-up"
)

func main() {
	// 创建配置加载器
	loader := go_up.NewGoUp().
		AddFile("config.json", true).  // 主配置文件
		AddFile("config-local.json", false) // 可选的本地覆盖配置

	// 加载配置
	err := loader.Load()
	if err != nil {
		panic(err)
	}

	// 获取配置值
	dbHost := loader.GetString("database.host")
	dbPort := loader.GetInt("database.port")
	
	fmt.Printf("Database: %s:%d\n", dbHost, dbPort)
}

递归占位符解析

go-up 的强大之处在于支持递归占位符解析,例如:

{
  "server": {
    "host": "localhost",
    "port": 8080,
    "url": "http://${server.host}:${server.port}"
  },
  "api": {
    "endpoint": "${server.url}/api/v1"
  }
}

解析后:

  • ${server.url} 会被替换为 http://localhost:8080
  • ${api.endpoint} 会被替换为 http://localhost:8080/api/v1

环境变量支持

go-up 还支持环境变量替换:

{
  "database": {
    "host": "${DB_HOST:localhost}",
    "port": "${DB_PORT:5432}"
  }
}
  • 如果设置了 DB_HOST 环境变量,则使用环境变量的值
  • 如果未设置,则使用默认值(localhost5432

高级功能示例

package main

import (
	"fmt"
	"github.com/ufoscout/go-up"
)

func main() {
	loader := go_up.NewGoUp().
		AddFile("config.yaml", true).
		AddFile("secrets.json", true).
		AddEnvVars("APP_", true) // 加载前缀为APP_的环境变量

	err := loader.Load()
	if err != nil {
		panic(err)
	}

	// 检查配置是否存在
	if loader.Has("logging.level") {
		logLevel := loader.GetString("logging.level")
		fmt.Println("Log level:", logLevel)
	}

	// 获取带默认值的配置
	cacheSize := loader.GetIntOrDefault("cache.size", 100)
	fmt.Println("Cache size:", cacheSize)

	// 获取嵌套配置
	dbConfig := loader.GetStringMap("database")
	fmt.Printf("Database config: %+v\n", dbConfig)

	// 获取所有配置
	allConfig := loader.GetAll()
	fmt.Printf("All config: %+v\n", allConfig)
}

多文件合并策略

当添加多个配置文件时:

  • 后添加的文件会覆盖之前文件的同名配置
  • 对于对象/映射类型,会进行深度合并而非简单覆盖
  • 可以通过第二个参数指定是否为必需文件

最佳实践

  1. 主配置文件存放默认配置
  2. 本地配置文件(如 config-local.json)存放开发环境特定配置,并加入 .gitignore
  3. 生产环境配置通过环境变量注入
  4. 敏感信息使用 secrets.json 单独管理

go-up 的递归占位符解析功能使得配置管理更加灵活,特别适合微服务架构和云原生应用场景。

回到顶部