Skip to main content

Maps in Go

Ayesha
EditReport

Maps in Go

Hey there! In this guide, we'll explore Maps in Go. Maps are Go's built-in associative data type (often called hashes or dictionaries in other languages). They are incredibly useful for storing key-value pairs. Let's dive in!

Video Explanation​

1. What is a Map?​

A map maps keys to values. For example, you might use a map to store the ages of users, where the user's name is the key (a string), and their age is the value (an int).

2. Declaring and Initializing Maps​

You define a map using the syntax map[KeyType]ValueType. The easiest way to create an empty map is by using the built-in make function.

// Creates an empty map where keys are strings and values are ints
ages := make(map[string]int)

You can also use a map literal to initialize a map with data immediately:

var capitals = map[string]string{
"USA": "Washington D.C.",
"France": "Paris",
"Japan": "Tokyo", // Note: The trailing comma is required in Go!
}

3. Working with Maps​

Inserting and Updating​

To insert a new key-value pair or update an existing one, simply assign a value to a specific key.

ages := make(map[string]int)
ages["Alice"] = 25 // Insert
ages["Bob"] = 30 // Insert
ages["Alice"] = 26 // Update Alice's age

Retrieving Elements​

You can retrieve the value associated with a key using the bracket syntax.

fmt.Println("Alice's age:", ages["Alice"]) // Output: 26

Deleting Elements​

Use the built-in delete function to remove a key-value pair from a map.

delete(ages, "Bob") // Removes Bob from the map

4. Checking if a Key Exists​

If you ask for a key that doesn't exist, a map returns the zero value for the value type (e.g., 0 for an int, "" for a string).

ages := make(map[string]int)
fmt.Println(ages["Charlie"]) // Output: 0 (because Charlie isn't in the map)

However, sometimes you need to know if the value 0 means the key wasn't there, or if the key actually had the value 0. You can test for the existence of a key with a two-value assignment:

age, exists := ages["Charlie"]

if exists {
fmt.Println("Charlie's age is", age)
} else {
fmt.Println("Charlie is not in the map")
}

If Charlie is in the map, exists will be true; if not, exists will be false.

5. Iterating over Maps​

You can loop over the key-value pairs of a map using the range keyword, just like with slices.

capitals := map[string]string{
"USA": "Washington D.C.",
"France": "Paris",
}

for country, capital := range capitals {
fmt.Printf("The capital of %s is %s\n", country, capital)
}

Important Note: Maps in Go are unordered! When you iterate over a map, the order of the keys is completely randomized by the Go runtime.

6. Best Practices​

  • Always initialize your maps: A declared but uninitialized map is nil. Trying to write to a nil map will cause a runtime panic! Always use make() or a map literal {}.
  • Use the ok idiom: Whenever retrieving a value from a map where the zero value is a valid piece of data, always use the value, ok := map[key] idiom to check if the key actually exists.
Telemetry Integration

Completed working through this block? Sync progress to workspace.