作为哈希表的 map没有指定的顺序,因此无法按已定义的顺序删除键,除非您按照添加键的顺序在单独的切片中跟踪键,例如:

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
}

只是为了清楚地说明为什么不能真正从 map中删除“ first”元素,让我参考一下规范

映射是一种类型无序元素组,称为元素类型,由一组另一种类型的唯一键(称为键类型)索引。未初始化映射的值为nil。

强调了 map项无序的事实

但是,从根本上说,使用切片保留键顺序的某些概念是有缺陷的。给定这样的操作:

foo := map[string]int{
    "foo": 1,
    "bar": 2,
}
// a bit later:
foo["foo"] = 3
foo

正如我之前所说:这是一个哈希表。例如,如果用于键的哈希算法产生冲突,则其中的元素会在后台重新洗牌。这个问题有一个XY问题的感觉:为什么需要对 map中的值进行排序?也许 map根本不是解决您特定问题的正确方法。