概要说明

Go 里面比较好用的是 viper 读取配置文件,支持直接根据字符串的方式解析

下面是一个表格,对比了 multiconfig 和 viper 的主要特性:

特性/库multiconfigviper
配置格式支持JSON, YAML, TOML, 等JSON, YAML, TOML, INI, HCL, 等
环境变量支持是是
命令行参数支持是是(通过 cobra)
配置自动绑定否是
实时监控配置文件变化否是
远程配置支持否是(如 etcd, Consul)
社区活跃度较低高
功能丰富性基础丰富
学习曲线简单中等
性能开销低中等(由于额外功能)
适用场景简单、轻量级的配置需求需要高级配置管理功能的项目

请注意,这个表格是基于 multiconfig 和 viper 的普遍认知和文档描述。实际使用时,可能会有更多的细节和特定的用例需要考虑。在选择配置库时,建议根据项目的具体需求和开发团队的偏好来做出决策。

如何合并多个配置文件

package main
 
import (
	"fmt"
	"github.com/spf13/viper"
)
 
func main() {
	viper.SetConfigName("config") // 配置文件的名字(无扩展名)
	viper.SetConfigType("yaml")   // 配置文件的类型
	viper.AddConfigPath("/etc/app/")   // 添加搜索配置文件的路径
	viper.AddConfigPath("$HOME/.app")  // 添加更多搜索路径
	viper.AddConfigPath(".")           // 当前目录
 
	// 读取第一个配置文件
	err := viper.ReadInConfig() // 查找并读取配置文件
	if err != nil {             // 处理读取配置文件的错误
		fmt.Printf("Error reading config file, %s\n", err)
	}
 
	// 读取第二个配置文件,并合并配置
	viper.SetConfigName("config2")
	err = viper.MergeInConfig()
	if err != nil {
		fmt.Printf("Error reading config file, %s\n", err)
	}
 
	// 使用配置
	fmt.Println("Using database:", viper.GetString("database.name"))
}