From 7733f79e05035f2bf5c168ca7119b328dc67b878 Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Mon, 5 May 2025 02:21:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=92=8C=E9=87=8D=E8=BD=BD=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8=E8=AF=BB=E5=86=99=E9=94=81=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.go | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/config/config.go b/config/config.go index c43cc39..1ea7abf 100644 --- a/config/config.go +++ b/config/config.go @@ -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) +}