Aperçu du problème :
Cet extrait de code charge les données des fichiers dans une carte au démarrage. Cependant, il est confronté à un problème lorsqu'il rencontre des erreurs lors du chargement du fichier. Le problème se pose car le code efface la carte avant de charger chaque nouveau fichier, ce qui peut entraîner une perte de données si une erreur se produit et que l'état précédent de la carte n'est pas conservé.
Solution proposée :
Pour surmonter ce problème, une approche plus simple peut être adoptée :
Mise en œuvre :
<code class="go">type CustomerConfig struct { Data map[string]bool LoadedAt time.Time } func loadConfig() (*CustomerConfig, error) { cfg := &CustomerConfig{ Data: map[string]bool{}, LoadedAt: time.Now(), } // Load files and populate cfg.Data // Return error if encountered return cfg, nil } type ConfigCache struct { configMu sync.RWMutex config *CustomerConfig closeCh chan struct{} } func NewConfigCache() (*ConfigCache, error) { cfg, err := loadConfig() if err != nil { return nil, err } cc := &ConfigCache{ config: cfg, closeCh: make(chan struct{}), } go cc.refresher() return cc, nil } func (cc *ConfigCache) refresher() { ticker := time.NewTicker(1 * time.Minute) defer ticker.Stop() for { select { case <-ticker.C: // Check for changes changes := false // Implement logic to detect changes if !changes { continue } cfg, err := loadConfig() if err != nil { log.Printf("Failed to load config: %v", err) continue } cc.configMu.Lock() cc.config = cfg cc.configMu.Unlock() case <-cc.closeCh: return } } } func (cc *ConfigCache) Stop() { close(cc.closeCh) } func (cc *ConfigCache) GetConfig() *CustomerConfig { cc.configMu.RLock() defer cc.configMu.RUnlock() return cc.config }</code>
Utilisation :
<code class="go">cc, err := NewConfigCache() if err != nil { // Handle error } cfg := cc.GetConfig() // Access the latest configuration</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!