gpt4 book ai didi

go - 有没有办法从golang中的 map 中删除第一个元素?

转载 作者:行者123 更新时间:2023-12-01 22:43:00 26 4
gpt4 key购买 nike

我可以删除 map 中的第一个元素吗? slice slice = append(slice, slice[1:]...)是可能的,但是我可以对 map 做类似的事情吗?

最佳答案

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

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”元素,让我 reference the spec:

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

强调了 map 项无序的事实

但是,从根本上说,使用 slice 保留键顺序的某些概念是有缺陷的。给定这样的操作:
foo := map[string]int{
"foo": 1,
"bar": 2,
}
// a bit later:
foo["foo"] = 3

索引/关键字 foo现在是否已更新或重新分配?是否应将其视为新条目,如果有键则附加在 slice 上,还是就地更新?事情很快就变得混乱了。问题的简单事实是, map 类型不包含事物的“顺序”,试图使其具有顺序很快就会耗费大量劳动,最终您将不得不编写自己的类型。

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

关于go - 有没有办法从golang中的 map 中删除第一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60829460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com