Maps in Go are collections that store data as key-value pairs, where each unique key is linked to a value. These are unordered, dynamic, and do not allow duplicate keys. The len()
function gives the total number of elements in a map, and their default value is nil
. Internally, maps use hash tables for efficient data management.
Creating Maps
Using var
and :=
Syntax
Maps can be initialized using the var
keyword or the shorthand :=
syntax.
Syntax
var mapName = map[KeyType]ValueType{key1: value1, key2: value2, ...}
mapName := map[KeyType]ValueType{key1: value1, key2: value2, ...}
Example
package main
import ("fmt")
func main() {
var motorcycles = map[string]string{"brand": "Honda", "model": "CB500F", "year": "2022"}
cars := map[string]int{"SUV": 5, "Sedan": 3, "Truck": 7}
fmt.Printf("motorcycles\t%v\n", motorcycles)
fmt.Printf("cars\t%v\n", cars)
}
Result
motorcycles map[brand:Honda model:CB500F year:2022]
cars map[Truck:7 Sedan:3 SUV:5]
Using make()
Function
The make()
function is commonly used to create maps.
Syntax
var mapName = make(map[KeyType]ValueType)
mapName := make(map[KeyType]ValueType)
Example
package main
import ("fmt")
func main() {
var motorcycles = make(map[string]string)
motorcycles["brand"] = "Yamaha"
motorcycles["model"] = "R3"
motorcycles["year"] = "2021"
cars := make(map[string]int)
cars["SUV"] = 4
cars["Sedan"] = 3
cars["Truck"] = 6
fmt.Printf("motorcycles\t%v\n", motorcycles)
fmt.Printf("cars\t%v\n", cars)
}
Result
motorcycles map[brand:Yamaha model:R3 year:2021]
cars map[Truck:6 Sedan:3 SUV:4]
Creating an Empty Map
An empty map can be created using make()
(preferred) or by defining its type.
Syntax
var mapName = make(map[KeyType]ValueType) // Recommended
var mapName map[KeyType]ValueType // May cause runtime panic if written to
Example
package main
import ("fmt")
func main() {
var motorcycles = make(map[string]string)
var cars map[string]string
fmt.Println(motorcycles == nil) // false
fmt.Println(cars == nil) // true
}
Result
false
true
Allowed Key Types
Map keys can be of types that support the equality operator (==
), including:
- Booleans
- Numbers
- Strings
- Arrays
- Pointers
- Structs
- Interfaces (if the dynamic type supports equality)
Invalid key types include:
- Slices
- Maps
- Functions (since the equality operator is not defined for them)
For values, any type is allowed.
Accessing Map Elements
Elements of a map can be accessed using their keys.
Syntax
value = mapName[key]
Example
package main
import ("fmt")
func main() {
motorcycles := map[string]string{"brand": "Suzuki", "model": "GSX-R750", "year": "2023"}
fmt.Println(motorcycles["brand"])
}
Result
Suzuki
Updating and Adding Elements
Maps allow you to update existing elements or add new ones by assigning values to keys.
Syntax
mapName[key] = value
Example
package main
import ("fmt")
func main() {
cars := make(map[string]string)
cars["brand"] = "BMW"
cars["model"] = "M3"
cars["year"] = "2019"
fmt.Println(cars)
cars["year"] = "2022" // Updating an element
cars["color"] = "blue" // Adding an element
fmt.Println(cars)
}
Result
map[brand:BMW model:M3 year:2019]
map[brand:BMW color:blue model:M3 year:2022]
Removing Elements
The delete()
function is used to remove elements from a map.
Syntax
delete(mapName, key)
Example
package main
import ("fmt")
func main() {
motorcycles := map[string]string{"brand": "Ducati", "model": "Monster", "year": "2020"}
fmt.Println(motorcycles)
delete(motorcycles, "year")
fmt.Println(motorcycles)
}
Result
map[brand:Ducati model:Monster year:2020]
map[brand:Ducati model:Monster]
Checking for Specific Elements
To check if a certain key exists, use the val, ok
pattern.
Syntax
val, ok := mapName[key]
Example
package main
import ("fmt")
func main() {
motorcycles := map[string]string{"brand": "Triumph", "model": "Bonneville", "year": "2017"}
val1, ok1 := motorcycles["brand"]
val2, ok2 := motorcycles["color"]
_, ok3 := motorcycles["model"]
fmt.Println(val1, ok1)
fmt.Println(val2, ok2)
fmt.Println(ok3)
}
Result
Triumph true
false
true
Maps Are References
Maps are reference types, meaning changes in one variable reflect in others pointing to the same map.
Example
package main
import ("fmt")
func main() {
cars := map[string]string{"brand": "Tesla", "model": "Model 3", "year": "2021"}
electricCars := cars
fmt.Println(cars)
fmt.Println(electricCars)
electricCars["year"] = "2023"
fmt.Println("After change to electricCars:")
fmt.Println(cars)
fmt.Println(electricCars)
}
Result
map[brand:Tesla model:Model 3 year:2021]
map[brand:Tesla model:Model 3 year:2021]
After change to electricCars:
map[brand:Tesla model:Model 3 year:2023]
map[brand:Tesla model:Model 3 year:2023]
Iterating Over Maps
Maps can be iterated using the range
keyword. Keep in mind the order is not guaranteed.
Example
package main
import ("fmt")
func main() {
motorcycles := map[string]int{"Sport": 1, "Adventure": 2, "Cruiser": 3, "Touring": 4}
for k, v := range motorcycles {
fmt.Printf("%v : %v, ", k, v)
}
}
Result
Touring : 4, Cruiser : 3, Sport : 1, Adventure : 2,
Iterating in a Specific Order
To maintain a specific order, use an additional structure.
Example
package main
import ("fmt")
func main() {
motorcycles := map[string]int{"Sport": 1, "Adventure": 2, "Cruiser": 3, "Touring": 4}
order := []string{"Sport", "Adventure", "Cruiser", "Touring"}
for _, key := range order {
fmt.Printf("%v : %v, ", key, motorcycles[key])
}
}
Result
Sport : 1, Adventure : 2, Cruiser : 3, Touring : 4,