Go 中的地图 - 如何避免双键查找?

rin*_*ind 3 go

假设我想更新映射中的某些现有值,或者在找不到键时执行其他操作。如何在不执行 2 次查找的情况下执行此操作?以下 C++ 代码的 golang 等效项是什么:

auto it = m.find(key);
if (it != m.end()) {
    // update the value, without performing a second lookup
    it->second = calc_new_value(it->second);
} else {
    // do something else
    m.insert(make_pair(key, 42));
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*dge 5

Go 不会像 C++ 那样公开映射的内部(键,值)对数据结构,因此您无法完全复制它。

一种可能的解决方法是设置地图指针的值,这样您就可以在地图中保留相同的值,但更新它们指向的内容。例如,如果m是 a map[int]*int,您可以使用以下方法更改值:

v := m[10]
*v = 42
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果减少哈希查找次数所节省的成本被额外的内存管理开销所吞噬,我不会感到惊讶。因此,无论您选择何种解决方案,都值得进行基准测试。