feat: 添加配置加载和重载功能,使用读写锁确保线程安全,并优化错误处理信息
This commit is contained in:
parent
cb8c83e09a
commit
7733f79e05
@ -1,12 +1,18 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ConfigManager = &Config{}
|
var (
|
||||||
|
ConfigManager = &Config{}
|
||||||
|
configLock = &sync.RWMutex{}
|
||||||
|
configLoaded = false
|
||||||
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
SteamApiKey string `yaml:"steam_api_key"`
|
SteamApiKey string `yaml:"steam_api_key"`
|
||||||
@ -26,25 +32,46 @@ type Config struct {
|
|||||||
} `yaml:"web_server"`
|
} `yaml:"web_server"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoadConfig 从指定路径加载配置文件
|
||||||
func (cm *Config) LoadConfig(path string) error {
|
func (cm *Config) LoadConfig(path string) error {
|
||||||
|
configLock.Lock()
|
||||||
|
defer configLock.Unlock()
|
||||||
|
|
||||||
data, err := os.ReadFile(path)
|
data, err := os.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("读取配置文件失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = yaml.Unmarshal(data, &cm)
|
err = yaml.Unmarshal(data, cm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("解析配置文件失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
configLoaded = true
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetConfig 获取配置实例,如果未加载则尝试从默认路径加载
|
||||||
func (cm *Config) GetConfig() *Config {
|
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")
|
err := ConfigManager.LoadConfig("config.yml")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(fmt.Errorf("加载默认配置失败: %w", err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cm
|
return cm
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReloadConfig 重新加载配置
|
||||||
|
func ReloadConfig(path string) error {
|
||||||
|
return ConfigManager.LoadConfig(path)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user