Карты, являющиеся хеш-таблицами, не имеют определенного порядка, поэтому невозможно удалить ключи в определенном порядке, если только вы не отслеживаете ключи в отдельном срезе, в порядке их добавления, что-то вроде:
type orderedMap struct {
data map[string]int
keys []string
mu *sync.RWMutex
}
func (o *orderedMap) Shift() (int, error) {
o.mu.Lock()
defer o.mu.Unlock()
if len(o.keys) == 0 {
return 0, ErrMapEmpty
}
i := o.data[o.keys[0]]
delete(o.data, o.keys[0])
o.keys = o.keys[1:]
return i, nil
}
Просто чтобы быть недвусмысленным, почему вы действительно не можете удалить «первый» элемент с карты, позвольте мне сослаться на spe c:
Карта - это неупорядоченная группа элементов одного типа, называемая типом элемента, индексируемая набором уникальных ключей другого типа, называемого типом ключа. Значение неинициализированной карты равно nil.
Добавлен акцент на тот факт, что элементы карты неупорядочены
Использование фрагмента для сохранения некоторого представления о порядок ключей, в принципе, некорректен. Для следующих операций:
foo := map[string]int{
"foo": 1,
"bar": 2,
}
// a bit later:
foo["foo"] = 3
Обновлен ли индекс / ключ foo
или переназначен? Должно ли оно рассматриваться как новая запись, добавленная к фрагменту, если ключи, или это обновление на месте? Вещи запутываются очень быстро. Простой факт в том, что тип карты не содержит «порядка» вещей, поэтому попытка сделать так, чтобы у него был порядок, быстро превращается в трудоемкую задачу, где вы в конечном итоге напишите свой собственный тип.
Как я уже говорил ранее: это хеш-таблица. Элементы внутри переставляются за кулисами, если, например, алгоритм хеширования, используемый для ключей, создает коллизии. Этот вопрос напоминает проблему XY: зачем вам нужно упорядочивать значения на карте? Возможно, карта просто не подходит для вашей конкретной проблемы.