Go Academy · Урок

Итерация по коллекциям с range

Использование range для срезов, отображений и строк

Урок 4 из 413 шагов

«Итерация по коллекциям с range» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Что такое перебор

range — это специальная форма цикла for, которая перебирает массивы, срезы, отображения, строки и каналы. На каждой итерации она возвращает индекс (или ключ) и значение.

Перебор по срезу

Возвращает индекс и копию элемента:

package main
import "fmt"

func main() {
    fruits := []string{"apple", "banana", "cherry"}
    for i, fruit := range fruits {
        fmt.Printf("%d: %s\n", i, fruit)
    }
}

Перебор по массиву

Работает так же, как для срезов. Элементы массива копируются на каждой итерации:

package main
import "fmt"

func main() {
    nums := [3]int{10, 20, 30}
    for _, v := range nums {
        fmt.Println(v)
    }
}

Перебор по отображению

Возвращает ключ и значение в случайном порядке:

package main
import "fmt"

func main() {
    capitals := map[string]string{
        "France": "Paris",
        "Japan":  "Tokyo",
    }
    for country, city := range capitals {
        fmt.Printf("%s -> %s\n", country, city)
    }
}

Перебор по строке

Перебирает кодовые точки Unicode (rune), а не байты. Индекс — это позиция байта, с которой начинается кодовая точка:

package main
import "fmt"

func main() {
    for i, r := range "héllo" {
        fmt.Printf("%d: %c\n", i, r)
    }
}

Отбрасывание индекса

Используйте _, чтобы игнорировать индекс, когда нужны только значения:

package main
import "fmt"

func main() {
    total := 0
    for _, v := range []int{1, 2, 3, 4, 5} {
        total += v
    }
    fmt.Println(total) // 15
}

Перебор только по индексу

Если опустить значение, будет возвращаться только индекс. Это удобно для изменения данных на месте:

package main
import "fmt"

func main() {
    s := []int{1, 2, 3}
    for i := range s {
        s[i] *= 2
    }
    fmt.Println(s) // [2 4 6]
}

Перебор по каналу

range читает из канала, пока тот не будет закрыт:

package main
import "fmt"

func main() {
    ch := make(chan int, 3)
    ch <- 1; ch <- 2; ch <- 3
    close(ch)
    for v := range ch {
        fmt.Println(v)
    }
}

Ловушка переменной цикла

Переменная перебора используется повторно на каждой итерации — захват её адреса в горутине или замыкании является классической ошибкой:

package main
import "fmt"

func main() {
    nums := []int{1, 2, 3}
    funcs := make([]func(), 3)
    for i, v := range nums {
        v := v // shadow with a copy
        funcs[i] = func() { fmt.Println(v) }
    }
    for _, f := range funcs { f() } // 1 2 3
}

Изменение элементов среза

Значение перебора — копия. Чтобы изменить элемент, используйте индекс:

package main
import "fmt"

func main() {
    s := []int{10, 20, 30}
    for i := range s {
        s[i]++
    }
    fmt.Println(s) // [11 21 31]
}

Быстрая проверка

При переборе строки какой тип имеет переменная значения?

Повторение: перебор

Основные выводы:

  • range работает со срезами, массивами, отображениями, строками и каналами
  • Возвращает (индекс, значение) — любой из них можно отбросить с помощью _
  • Значения перебора являются копиями — изменяйте данные через индекс
  • Строки возвращают руны, а не байты
  • Порядок перебора отображения случаен

Задание для практики

Используйте перебор, чтобы вычислить сумму всех значений в map[string]int и вывести каждую запись и итоговую сумму.

Можно начать бесплатно

Изучай Go с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Итерация по коллекциям с range» бесплатный?

Да — полный текст урока «Итерация по коллекциям с range» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Итерация по коллекциям с range»?

Использование range для срезов, отображений и строк Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Итерация по коллекциям с range»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Массивы: коллекции фиксированной длины
  2. Срезы: динамические списки
  3. Отображения: хранилища пар ключ-значение
  4. Итерация по коллекциям с range
← Назад к Go Academy