dictionary – How to check if a map contains a key in Go?

dictionary – How to check if a map contains a key in Go?

One line answer:

if val, ok := dict[foo]; ok {
    //do something here
}

Explanation:

if statements in Go can include both a condition and an initialization statement. The example above uses both:

  • initializes two variables – val will receive either the value of foo from the map or a zero value (in this case the empty string) and ok will receive a bool that will be set to true if foo was actually present in the map

  • evaluates ok, which will be true if foo was in the map

If foo is indeed present in the map, the body of the if statement will be executed and val will be local to that scope.

In addition to The Go Programming Language Specification, you should read Effective Go. In the section on maps, they say, amongst other things:

An attempt to fetch a map value with a key that is not present in the
map will return the zero value for the type of the entries in the map.
For instance, if the map contains integers, looking up a non-existent
key will return 0. A set can be implemented as a map with value type
bool. Set the map entry to true to put the value in the set, and then
test it by simple indexing.

attended := map[string]bool{
    Ann: true,
    Joe: true,
    ...
}

if attended[person] { // will be false if person is not in the map
    fmt.Println(person, was at the meeting)
}

Sometimes you need to distinguish a missing entry from a zero value.
Is there an entry for UTC or is that 0 because its not in the map
at all? You can discriminate with a form of multiple assignment.

var seconds int
var ok bool
seconds, ok = timeZone[tz]

For obvious reasons this is called the “comma ok” idiom. In this
example, if tz is present, seconds will be set appropriately and ok
will be true; if not, seconds will be set to zero and ok will be
false. Heres a function that puts it together with a nice error
report:

func offset(tz string) int {
    if seconds, ok := timeZone[tz]; ok {
        return seconds
    }
    log.Println(unknown time zone:, tz)
    return 0
}

To test for presence in the map without worrying about the actual
value, you can use the blank identifier (_) in place of the usual
variable for the value.

_, present := timeZone[tz]

dictionary – How to check if a map contains a key in Go?

Searched on the go-nuts email list and found a solution posted by Peter Froehlich on 11/15/2009.

package main

import fmt

func main() {
        dict := map[string]int {foo : 1, bar : 2}
        value, ok := dict[baz]
        if ok {
                fmt.Println(value: , value)
        } else {
                fmt.Println(key not found)
        }
}

Or, more compactly,

if value, ok := dict[baz]; ok {
    fmt.Println(value: , value)
} else {
    fmt.Println(key not found)
}

Note, using this form of the if statement, the value and ok variables are only visible inside the if conditions.

Leave a Reply

Your email address will not be published.