👣 Про утечку памяти с time.AfterFunc



▶️Вопрос: будет ли течь память при такой реализации TTL in-memory-кеша (предполагаемый размер кеша — несколько десятков тысяч объектов)?

package cache



import (

"sync"

"time"

)



type Cache struct {

*sync.Map

TTL time.Duration

}



func New(ttl time.Duration) *Cache {

return &Cache{

Map: new(sync.Map),

TTL: ttl,

}

}



func (c *Cache) Store(key, value interface{}) {

c.Map.Store(key, value)

// memory leak?

time.AfterFunc(c.TTL, func() {

c.Map.Delete(key)

})

}






▶️Утечки быть не должно, так как в документации к типу time.Timer и его методам нет ничего про обязательные деструкторы как у time.Ticker. При этом в коде выше как минимум 2 проблемы:



• Создаётся множество таймеров, что увеличивает потребление ОЗУ и создаёт дополнительную нагрузку на планировщик.



• Если положить значение по ключу дважды, сотрётся оно по истечении первого TTL, а не второго.



И то, и другое можно вылечить, если просто запоминать время установки значения и проходиться по всем значением раз в N миллисекунд, удаляя устаревшие.



@golang_interview