Итерация по коллекциям с range
Использование range для срезов, отображений и строк
«Итерация по коллекциям с 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 — локальная установка не требуется.
Все уроки этого курса
- Массивы: коллекции фиксированной длины
- Срезы: динамические списки
- Отображения: хранилища пар ключ-значение
- Итерация по коллекциям с range