go加载配置

go 复制代码
package config

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"log"
	"os"
	"strings"
)

const (
	configFilePattern    = "config/%s"
	mainConfigFile       = "application.yaml"
	addConfigFilePattern = "application-%s.yaml"
)

// LoadConfig 加载配置信息
// 参数 cfg 为待赋值配置对象引用
// 加载"config/application.yaml和config/application-[ENV]"配置文件,其中"ENV"可以是英文逗号分割字符串,加载顺序由前往后,优先级由低到高(即相同配置后面覆盖前面)
func LoadConfig(cfg interface{}) error {
	env := strings.TrimSpace(os.Getenv("ENV"))
	configFileNames := []string{mainConfigFile}
	if len(env) != 0 {
		profiles := strings.Split(env, ",")
		for i := 0; i < len(profiles); i++ {
			profile := strings.TrimSpace(profiles[i])
			if len(profile) == 0 {
				continue
			}
			configFileNames = append(configFileNames, fmt.Sprintf(addConfigFilePattern, profile))
		}
	}
	for _, configFileName := range configFileNames {
		filePath := fmt.Sprintf(configFilePattern, configFileName)
		if _, err := os.Stat(filePath); os.IsNotExist(err) {
			log.Println(fmt.Sprintf("配置文件 %s 不存在,已跳过加载", filePath))
			continue
		}
		yamlFile, err := os.ReadFile(filePath)
		if err != nil {
			log.Println(fmt.Sprintf("配置文件 %s 加载异常:%v", filePath, err))
			return err
		}
		err = yaml.Unmarshal(yamlFile, cfg)
		if err != nil {
			fmt.Errorf("配置文件 %s 解析异常: %v", filePath, err)
			return err
		}
	}
	return nil
}

配置

go 复制代码
package config

import (
	"github.com/redis/go-redis/v9"
)

// ServerConfig Web服务配置
type ServerConfig struct {
	Port int    `yaml:"port"`
	Name string `yaml:"name"`
}

// DatasourceConfig 数据源配置
type DatasourceConfig struct {
	Host            string `yaml:"host"`
	Port            int    `yaml:"port"`
	Username        string `yaml:"username"`
	Password        string `yaml:"password"`
	DatabaseName    string `yaml:"databaseName"`
	MaxIdleConns    int    `yaml:"maxIdleConns"`    // 设置最大空闲连接数
	MaxOpenConns    int    `yaml:"maxOpenConns"`    // 设置最大空闲连接数
	ConnMaxLifetime int    `yaml:"connMaxLifetime"` // 设置连接的最大生命周期
}

// RedisConfig Redis配置
type RedisConfig struct {
	Host            string `yaml:"host"`
	Port            int    `yaml:"port"`
	Password        string `yaml:"password"`
	Database        int    `yaml:"database"`
	PoolSize        int    `yaml:"poolSize"`        // 连接池大小
	MaxIdleConns    int    `yaml:"maxIdleConns"`    // 最大空闲连接
	ConnMaxLifetime int    `yaml:"connMaxLifetime"` // 设置连接的最大生命周期
}

// BusConfig Redis配置
type BusConfig struct {
}

type Config struct {
	ServerConfig     `yaml:"server"`
	DatasourceConfig `yaml:"datasource"`
	RedisConfig      redis.Options `yaml:"redis"`

	BusConfig `yaml:"bus"`
}

加载

go 复制代码
appConfig := config.Config{}
globalConfigs.LoadConfig(&appConfig)
相关推荐
也无晴也无风雨44 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
__AtYou__3 小时前
Golang | Leetcode Golang题解之第557题反转字符串中的单词III
leetcode·golang·题解
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
一丝晨光4 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计