Golang range keyword
last modified May 7, 2025
This tutorial explains how to use the range keyword in Go. We'll
cover iteration basics with practical examples of ranging over collections.
The range keyword provides iteration over arrays, slices, maps, strings, and channels. It returns index/value pairs for ordered collections.
In Go, range simplifies loop syntax when working with collections.
It handles the iteration logic automatically, making code cleaner and safer.
Basic range over a slice
The simplest use of range iterates over a slice. This example
shows how to access both index and value.
package main
import "fmt"
func main() {
fruits := []string{"apple", "banana", "cherry"}
for index, fruit := range fruits {
fmt.Printf("Index: %d, Value: %s\n", index, fruit)
}
}
The loop iterates through the slice, assigning index to index and
value to fruit. Range handles the iteration bounds automatically.
Range with maps
range works with maps by returning key/value pairs. This example
demonstrates iterating over a map's entries.
package main
import "fmt"
func main() {
ages := map[string]int{
"Alice": 25,
"Bob": 30,
"Carol": 28,
}
for name, age := range ages {
fmt.Printf("%s is %d years old\n", name, age)
}
}
Map iteration order is not guaranteed. Each run may produce different output ordering. Range simplifies map traversal syntax.
Ignoring index or value
You can ignore either the index or value using _. This example
shows both cases.
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30, 40, 50}
// Ignore index
for _, value := range numbers {
fmt.Println(value)
}
// Ignore value
for index := range numbers {
fmt.Println(index)
}
}
The underscore _ discards unwanted values. This makes code cleaner
when you only need one part of the pair.
Range with strings
When ranging over strings, Go iterates over Unicode code points. This example demonstrates character iteration.
package main
import "fmt"
func main() {
greeting := "Hello, 世界"
for index, runeValue := range greeting {
fmt.Printf("Index: %d, Rune: %c\n", index, runeValue)
}
}
The loop processes each Unicode character separately. Note that some characters may occupy multiple bytes in UTF-8 encoding.
Range with channels
range can iterate over channel values until the channel is closed.
This example shows channel iteration.
package main
import "fmt"
func main() {
ch := make(chan string, 2)
ch <- "first"
ch <- "second"
close(ch)
for value := range ch {
fmt.Println(value)
}
}
The loop reads from the channel until it's closed. Range simplifies channel consumption by handling the close condition automatically.
Range with pointers to arrays
When ranging over array pointers, Go automatically dereferences them. This example demonstrates this behavior.
package main
import "fmt"
func main() {
arr := [3]int{1, 2, 3}
ptr := &arr
for index, value := range ptr {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}
}
The pointer ptr is automatically dereferenced during iteration.
This makes working with array pointers more convenient.
Practical example: Summing values
This practical example demonstrates using range to calculate the
sum of values in a slice.
package main
import "fmt"
func main() {
numbers := []int{5, 10, 15, 20, 25}
sum := 0
for _, num := range numbers {
sum += num
}
fmt.Printf("Sum: %d\n", sum)
}
The loop ignores the index using _ and accumulates values in
sum. Range makes the iteration clean and concise.
Source
This tutorial covered the range keyword in Go with practical
examples of iterating over different collection types.
Author
List all Golang tutorials.