go - 有没有办法从地图中删除第一个元素?
问题描述
我可以删除地图中的第一个元素吗?slices 是可能的slice = append(slice, slice[1:]...)
,但是我可以用 maps 做这样的事情吗?
解决方案
作为哈希表的映射没有指定的顺序,因此无法按定义的顺序删除键,除非您按照添加它们的顺序在单独的切片中跟踪键,例如:
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
}
只是为了明确说明为什么您不能真正从地图中删除“第一个”元素,让我参考一下规范:
映射是一种类型的无序元素组,称为元素类型,由另一种类型的一组唯一键索引,称为键类型。未初始化映射的值为 nil。
添加了对地图项无序这一事实的强调
但是,从根本上说,使用切片来保留键顺序的某些概念是有缺陷的。给定这样的操作:
foo := map[string]int{
"foo": 1,
"bar": 2,
}
// a bit later:
foo["foo"] = 3
索引/键foo
现在是否已更新或重新分配?是否应该将其视为新条目,如果键附加到切片,还是就地更新?事情很快就变得混乱了。一个简单的事实是 map 类型不包含事物的“顺序”,试图让它快速下放到一个劳动密集型任务中,你最终会编写自己的类型。
正如我之前所说:它是一个哈希表。例如,如果用于键的散列算法产生冲突,则其中的元素会在幕后重新洗牌。这个问题有一种 XY 问题的感觉:为什么需要对地图中的值进行排序?也许地图根本不是解决您特定问题的正确方法。
推荐阅读
- swift - 为什么 Swift 需要在 super.init() 之前初始化子类的属性
- java - 多对一映射中的 PropertyReference 异常
- python - Django 1.11 如何只执行一次代码,使用 Django 模型将数据保存到数据库
- android - 错误:[TAG] 无法解析变量“${project.version}”
- ios - 将 IOS 应用程序连接到 asp.net API 时获得 ATS 失败的系统信任。错误代码 9813
- apache-spark - 我在哪里可以找到 Spark/scala 的窗口函数的定义
- c# - 如何使用矩阵值在 uwp 中获取矩形的旋转边界
- r - 如何根据 CSV 格式的名称列表从 FASTA 文件中选择基因?
- c# - 防止从数组c#中删除条目
- ionic-framework - 如何修复 Android 和 iOS 设备上不同的离子标签图标显示?