登录
首页 >  Golang >  Go问答

如何从地图中移除第一个元素?

来源:stackoverflow

时间:2024-02-29 12:36:25 500浏览 收藏

大家好,我们又见面了啊~本文《如何从地图中移除第一个元素?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我可以删除地图中的第一个元素吗?可以使用切片 slice =append(slice, slice[1:]...),但是我可以用地图做这样的事情吗?


解决方案


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

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
}

为了明确说明为什么您无法真正从地图中删除“第一个”元素,请让我 reference the spec

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

强调了地图项无序这一事实

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

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

索引/键 foo 现在是否已更新或重新分配?是否应该将其视为新条目,附加到 if 键的切片中,还是就地更新?事情很快就会变得混乱。事实很简单,地图类型不包含事物的“顺序”,试图使其具有顺序很快就会变成一项劳动密集型任务,您最终将编写你自己的类型。

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何从地图中移除第一个元素?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>