feat: 添加配置加载和重载功能,使用读写锁确保线程安全,并优化错误处理信息
This commit is contained in:
parent
cb8c83e09a
commit
7733f79e05
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user