Maps make lookup code direct when the program needs to find a value by key.

lookup Performance decisions often start with choosing a data shape that matches the operation: scan a slice or look up a key.

Map Lookup Shape

key
map_lookup_shape.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func main() {
	var key = "beta"
	scores := map[string]int{
		"alpha": 3,
		"beta":  5,
		"gamma": 8,
	}
	value, ok := scores[key]
	result := "miss"
	if ok {
		result = "hit"
	}

	fmt.Println("key=", key)
	fmt.Println("value=", value)
	fmt.Println("found=", ok)
	fmt.Println("result=", result)
}
package main

import "fmt"

func main() {
	var key = "alpha"
	scores := map[string]int{
		"alpha": 3,
		"beta":  5,
		"gamma": 8,
	}
	value, ok := scores[key]
	result := "miss"
	if ok {
		result = "hit"
	}

	fmt.Println("key=", key)
	fmt.Println("value=", value)
	fmt.Println("found=", ok)
	fmt.Println("result=", result)
}
package main

import "fmt"

func main() {
	var key = "missing"
	scores := map[string]int{
		"alpha": 3,
		"beta":  5,
		"gamma": 8,
	}
	value, ok := scores[key]
	result := "miss"
	if ok {
		result = "hit"
	}

	fmt.Println("key=", key)
	fmt.Println("value=", value)
	fmt.Println("found=", ok)
	fmt.Println("result=", result)
}
  1. key ← "beta", scores ← map[string]int{"alpha":3, "beta":5, "gamma":8}

    5func main() {6  var key→ "beta" = "beta" //@key="alpha", "missing"7  scores→ map[string]int{"alpha":3, "beta":5, "gamma":8} := map[string]int{8    "alpha": 3,9    "beta":  5,10    "gamma": 8,11  }12  value→ 5, ok→ true := scores[key]513  result→ "miss" := "miss"14  if ok {
  2. result ← "hit"

    13result := "miss"14if oktrue {15  result→ "hit" = "hit"16}
  3. fmt.Println("key=", key)

    18  fmt.Println("key=", key"beta")19  fmt.Println("value=", value5)20  fmt.Println("found=", oktrue)21  fmt.Println("result=", result"hit")22}
    outputkey= beta
    value= 5
    found= true
    result= hit
  1. key ← "alpha", scores ← map[string]int{"alpha":3, "beta":5, "gamma":8}

    5func main() {6  var key→ "alpha" = "alpha"7  scores→ map[string]int{"alpha":3, "beta":5, "gamma":8} := map[string]int{8    "alpha": 3,9    "beta":  5,10    "gamma": 8,11  }12  value→ 3, ok→ true := scores[key]313  result→ "miss" := "miss"14  if ok {
  2. result ← "hit"

    13result := "miss"14if oktrue {15  result→ "hit" = "hit"16}
  3. fmt.Println("key=", key)

    18  fmt.Println("key=", key"alpha")19  fmt.Println("value=", value3)20  fmt.Println("found=", oktrue)21  fmt.Println("result=", result"hit")22}
    outputkey= alpha
    value= 3
    found= true
    result= hit
  1. key ← "missing", scores ← map[string]int{"alpha":3, "beta":5, "gamma":8}

    5func main() {6  var key→ "missing" = "missing"7  scores→ map[string]int{"alpha":3, "beta":5, "gamma":8} := map[string]int{8    "alpha": 3,9    "beta":  5,10    "gamma": 8,11  }12  value→ 0, ok→ false := scores[key]013  result→ "miss" := "miss"14  if ok {15    result = "hit"16  }1718  fmt.Println("key=", key"missing")19  fmt.Println("value=", value0)20  fmt.Println("found=", okfalse)21  fmt.Println("result=", result"miss")22}
    outputkey= missing
    value= 0
    found= false
    result= miss