range итерирует по слайсам, массивам, картам, строкам и каналам.
// Слайс: индекс + значение
for i, v := range []int{10, 20, 30} {
fmt.Println(i, v)
}
// Карта: ключ + значение (порядок случайный!)
for k, v := range map[string]int{"a": 1} {
fmt.Println(k, v)
}
// Строка: индекс байта + rune (Unicode)
for i, r := range "Привет" {
fmt.Printf("%d: %c\n", i, r)
}
// Канал: читает до закрытия
for msg := range ch {
fmt.Println(msg)
}
Ловушка: range копирует значение. Если нужна модификация элемента слайса — обращайся по индексу: slice[i].field = ....