Go на примерах: Range по встроенным типам

range позволяет итерироваться по элементам различных встроенных структур данных. Посмотрим, как использовать range с некоторыми структурами данных, которые мы уже изучили.

package main
import "fmt"
func main() {

Здесь мы используем range для суммирования чисел в слайсе. С массивами это тоже работает.

    nums := []int{2, 3, 4}
    sum := 0
    for _, num := range nums {
        sum += num
    }
    fmt.Println("sum:", sum)

range для массивов и слайсов возвращает и индекс, и значение для каждого элемента. Выше нам не нужен был индекс, поэтому мы проигнорировали его с помощью пустого идентификатора _. Но иногда нам действительно нужны индексы.

    for i, num := range nums {
        if num == 3 {
            fmt.Println("index:", i)
        }
    }

range для map итерируется по парам ключ/значение.

    kvs := map[string]string{"a": "яблоко", "b": "банан"}
    for k, v := range kvs {
        fmt.Printf("%s -> %s\n", k, v)
    }

range также может итерироваться только по ключам map.

    for k := range kvs {
        fmt.Println("key:", k)
    }

range для строк итерируется по кодовым точкам Unicode. Первое значение — это начальный байтовый индекс rune, а второе — сама rune. Подробнее см. в статье Строки и руны.

    for i, c := range "go" {
        fmt.Println(i, c)
    }
}
$ go run range-over-built-in-types.go
sum: 9
index: 1
a -> яблоко
b -> банан
key: a
key: b
0 103
1 111

Далее: .