我有一个带有整数值的映射。我想更新一个值,然后检查更新后的值是否超过阈值。
如果我不需要检查新值,那么我会简单地
map[key] += 1
如果要检查新值,最明显的变化是:
old_val := map[key]
new_val := old_val + 1
map[key] = new_val
if (new_val > threshold) {
return
}
但是,这会对地图进行两次索引调用,这不一定是恒定时间操作。
我想做的事情是这样的:
val_p := &(map[key])
*(val_p) += 1
if (*(val_p) > threshold) {
return
}
但是,GoLang映射无法通过设计寻址,因为地址可以明显更改(尽管在这种情况下不会更改,因为我没有更改映射)。
是否可以使用某些函数来更新返回新值的映射中的元素?专门用于整数吗?
答案 0 :(得分:1)
由于问题中提到的原因,您不能使用“简单”值。
您可能要做的是在地图中存储包装器或指针,因此您只需要查找值,并且只需要执行一次即可;更改数据将更改地图外的指针值,因此您无需重新分配(指针不变)。
例如:
const threshold = 3
m := map[string]*int{
"one": new(int),
}
for {
p := m["one"]
fmt.Println("data=", *p)
*p++
if *p > threshold {
fmt.Println("threshold reached", *p)
break
}
}
这将输出(在Go Playground上尝试):
data= 0
data= 1
data= 2
data= 3
threshold reached 4
尽管请注意,由于指针的间接作用,这可能不会更快。衡量这是否是您应用程序的关键部分。