Немного необычно хотеть хранить пустые слоты на карте. Если вы хотите удалить элемент с карты, вы можете удалить его, а затем вы можете использовать индексное выражение формы с двумя результатами , чтобы проверить, есть ли что-то на карте или нет .
m := make(map[string]int)
m["x"] = 1
if _, ok := m["x"]; ok {
fmt.Printf("x is there")
}
delete(m, "x")
if _, ok := m["x"]; !ok {
fmt.Printf("x is not there")
}
Обычно вам нужно больше, чем просто карта ключ-значение для реализации наименее недавно использованного; вам нужна какая-то другая побочная структура данных, например, двусвязный список , чтобы запомнить, в каком порядке они использовались. (Если у вас есть какое-то постоянное значение, такое как временная метка, куча тоже будет работать.) может хранить пары фактических значений и временных меток в значениях карты, но тогда вам придется искать по всему списку, чтобы найти самый старый.
import "container/list"
type CacheValue struct {
Key string
Value int
}
type Cache struct {
values map[string]*list.Element
lru *list.List
}
func makeCache() *Cache {
return &Cache{
values: make(map[string]*list.Element),
lru: list.New(),
}
}
func (c *Cache) Put(k string, v int) {
cv := CacheValue{Key: k, Value: v}
el := c.lru.PushFront(&cv)
c.values[k] = el
}
func (c *Cache) Get(k string) int {
el, ok := c.values[k]
if ok {
c.lru.MoveToFront(el)
return el.Value.(*CacheValue).Value
}
return 0
}
func (c *Cache) DeleteOldest() {
el := c.lru.Back()
if el != nil {
delete(c.values, el.Value.(*CacheValue).Key)
c.lru.Remove(el)
}
}