rincewind
rincewind

Reputation: 1183

Maps in Go - how to avoid double key lookup?

Suppose I want to update some existing value in a map, or do something else if the key is not found. How do I do this, without performing 2 lookups? What's the golang equivalent of the following C++ code:

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));
}

Upvotes: 3

Views: 754

Answers (2)

Matt Joiner
Matt Joiner

Reputation: 118540

You cannot. The situation is actually the same with Python dicts. However it shouldn't matter. Both lookup and assignment to a Go map are amortized O(1). Combining the two operations has the same time complexity.

Upvotes: 2

James Henstridge
James Henstridge

Reputation: 43899

Go does not expose the map's internal (key,value) pair data structure like C++ does, so you can't replicate this exactly.

One possible work around would be to make the values of your map pointers, so you can keep the same values in the map but update what they point to. For example, if m is a map[int]*int, you could change a value with:

v := m[10]
*v = 42

With that said, I wouldn't be surprised if the savings from reducing the number of hash lookups will be eaten by the additional memory management overhead. So it would be worth benchmarking whatever solution you settle on.

Upvotes: 5

Related Questions