Перейти до основного вмісту
Модуль 2 · Урок 3 із 58/50 у курсі~10 min
Модульні уроки (3/5)

для...дальності

for ... range — це ідіоматичний спосіб перебору колекцій: фрагменти, масиви, карти, рядки та канали. Трохи змінюється синтаксис залежно від колекції, але базовий шаблон завжди однаковий: for key, value := range coll { ... }.

Діапазон на зрізах і масивах

Повертає індекс і копію значення:

Go
nums := []int{10, 20, 30}
for i, v := range nums {
    fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30

Часто достатньо одного з двох:

Go
// solo indice
for i := range nums { _ = i }

// solo valore (ignora indice con _)
for _, v := range nums { _ = v }

Діапазон на карті

Повертає ключ і значення:

Go
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
    fmt.Println(k, v)
}

Діапазон у рядку: руни, а не байти

for i, r := range s повторює за кодовою точкою Unicode (руною), а не за байт. Індекс i — це байтове зміщення початку руни.

Go
for i, r := range "èé" {
    fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)

Для ітерації по байту використовуйте класичне індексування:

Go
s := "ciao"
for i := 0; i < len(s); i++ {
    fmt.Println(s[i])  // byte (uint8)
}

Діапазон на каналі

Повторюється, доки канал не буде закрито:

Go
ch := make(chan int)
go func() {
    for i := 0; i < 3; i++ { ch <- i }
    close(ch)
}()
for v := range ch {
    fmt.Println(v)
}

Ми заглибимося в модуль Concurrency.

Спробуйте

вправи#go.m2.l3.e1
Спроби: 0Завантаження…

Вивести індекс і значення кожного елемента nums за допомогою for-range.

Завантаження редактора…

Рішення доступне після 3 спроб

вправи#go.m2.l3.e2
Спроби: 0Завантаження…

Підсумуйте всі значення nums без урахування індексу.

Завантаження редактора…
Показати підказку

Використовуйте `_`, щоб відхилити індекс.

Рішення доступне після 3 спроб

Quiz#go.m2.l3.e3
Готовий

Що означає перша змінна в `for k, v := range m`, коли m є картою?

Go
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }
Варіанти відповідей

Підведення підсумків

  • for k, v := range coll з чіткою сферою дії: відкидайте за допомогою _ те, що ви не використовуєте.
  • Зріз/масив: індекс + КОПІЯ значення. Щоб мутувати, індексувати.
  • Карта: ключ + значення, порядок рандомізований під час кожного запуску.
  • Рядок: діапазон ітерується на руну (кодову точку), а не на байт.
  • Канал: ітерація, коли канал відкритий; закрито за допомогою close().