Garis Masalah:
Coretan kod ini memuatkan data daripada fail ke dalam peta semasa permulaan. Walau bagaimanapun, ia menghadapi masalah apabila menghadapi ralat semasa memuatkan fail. Isu ini timbul kerana kod mengosongkan peta sebelum memuatkan setiap fail baharu, yang boleh menyebabkan kehilangan data jika ralat berlaku dan keadaan peta sebelumnya tidak dikekalkan.
Cadangan Penyelesaian:
Untuk mengatasi isu ini, pendekatan yang lebih mudah boleh diguna pakai:
Pelaksanaan:
<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>
Penggunaan:
<code class="go">cc, err := NewConfigCache() if err != nil { // Handle error } cfg := cc.GetConfig() // Access the latest configuration</code>
Atas ialah kandungan terperinci Tajuknya boleh jadi: **Bagaimana untuk Mengendalikan Ralat Semasa Memuatkan Fail dalam Peta Data?**. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!