是否可以在没有两个索引调用的情况下更新和检索Map中的元素?

时间:2019-03-21 14:59:24

标签: go hashmap

我有一个带有整数值的映射。我想更新一个值,然后检查更新后的值是否超过阈值。

如果我不需要检查新值,那么我会简单地

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映射无法通过设计寻址,因为地址可以明显更改(尽管在这种情况下不会更改,因为我没有更改映射)。

是否可以使用某些函数来更新返回新值的映射中的元素?专门用于整数吗?

1 个答案:

答案 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

尽管请注意,由于指针的间接作用,这可能不会更快。衡量这是否是您应用程序的关键部分。