Код IT Загрузка примера кода…

Go main.go
type CachedResolver struct {
    cache    map[string][]string
    mutex    sync.RWMutex
    resolver *net.Resolver
}

func (r *CachedResolver) Resolve(ctx context.Context, host string) ([]string, error) {
    // Чтение из кэша
    r.mutex.RLock()
    if addrs, ok := r.cache[host]; ok {
        r.mutex.RUnlock()
        return addrs, nil
    }
    r.mutex.RUnlock()
    
    // Разрешение и кэширование
    addrs, err := r.resolver.LookupHost(ctx, host)
    if err != nil {
        return nil, err
    }
    
    r.mutex.Lock()
    r.cache[host] = addrs
    r.mutex.Unlock()
    
    // Фоновое обновление каждые 30 секунд
    go r.periodicRefresh(host, 30*time.Second)
    
    return addrs, nil
}
type CachedResolver struct {
    cache    map[string][]string
    mutex    sync.RWMutex
    resolver *net.Resolver
}

func (r *CachedResolver) Resolve(ctx context.Context, host string) ([]string, error) {
    // Чтение из кэша
    r.mutex.RLock()
    if addrs, ok := r.cache[host]; ok {
        r.mutex.RUnlock()
        return addrs, nil
    }
    r.mutex.RUnlock()
    
    // Разрешение и кэширование
    addrs, err := r.resolver.LookupHost(ctx, host)
    if err != nil {
        return nil, err
    }
    
    r.mutex.Lock()
    r.cache[host] = addrs
    r.mutex.Unlock()
    
    // Фоновое обновление каждые 30 секунд
    go r.periodicRefresh(host, 30*time.Second)
    
    return addrs, nil
}