Descripción del problema:
Este fragmento de código carga datos de archivos en un mapa durante el inicio. Sin embargo, enfrenta un problema cuando encuentra errores durante la carga del archivo. El problema surge porque el código borra el mapa antes de cargar cada archivo nuevo, lo que puede provocar la pérdida de datos si se produce un error y no se conserva el estado del mapa anterior.
Solución propuesta:
Para superar este problema, se puede adoptar un enfoque más sencillo:
Implementación:
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
}
Uso:
cc, err := NewConfigCache()
if err != nil {
// Handle error
}
cfg := cc.GetConfig() // Access the latest configuration
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3