feat: 添加配置加载和重载功能,使用读写锁确保线程安全,并优化错误处理信息

This commit is contained in:
lixiangwuxian 2025-05-05 02:21:46 +08:00
parent cb8c83e09a
commit 7733f79e05

View File

@ -1,12 +1,18 @@
package config
import (
"fmt"
"os"
"sync"
"gopkg.in/yaml.v3"
)
var ConfigManager = &Config{}
var (
ConfigManager = &Config{}
configLock = &sync.RWMutex{}
configLoaded = false
)
type Config struct {
SteamApiKey string `yaml:"steam_api_key"`
@ -26,25 +32,46 @@ type Config struct {
} `yaml:"web_server"`
}
// LoadConfig 从指定路径加载配置文件
func (cm *Config) LoadConfig(path string) error {
configLock.Lock()
defer configLock.Unlock()
data, err := os.ReadFile(path)
if err != nil {
return err
return fmt.Errorf("读取配置文件失败: %w", err)
}
err = yaml.Unmarshal(data, &cm)
err = yaml.Unmarshal(data, cm)
if err != nil {
return err
return fmt.Errorf("解析配置文件失败: %w", err)
}
configLoaded = true
return nil
}
// GetConfig 获取配置实例,如果未加载则尝试从默认路径加载
func (cm *Config) GetConfig() *Config {
if cm == nil {
configLock.RLock()
if configLoaded {
configLock.RUnlock()
return cm
}
configLock.RUnlock()
// 如果当前实例是ConfigManager但配置尚未加载尝试加载
if cm == ConfigManager {
err := ConfigManager.LoadConfig("config.yml")
if err != nil {
panic(err)
panic(fmt.Errorf("加载默认配置失败: %w", err))
}
}
return cm
}
// ReloadConfig 重新加载配置
func ReloadConfig(path string) error {
return ConfigManager.LoadConfig(path)
}