Какие существуют способы итерации по слайсу в Go и в чем их особенности?

Ответ

В Go существует два основных способа итерации по слайсу:

1. С помощью for...range

Это наиболее идиоматичный и распространенный способ. Конструкция range возвращает два значения: индекс элемента и копию самого элемента.

package main

import "fmt"

func main() {
    mySlice := []string{"a", "b", "c"}
    for index, value := range mySlice {
        fmt.Printf("Индекс: %d, Значение: %sn", index, value)
    }
}

Важный нюанс: Поскольку value является копией, изменение value внутри цикла не изменит исходный слайс. Для изменения элементов слайса нужно обращаться к нему по индексу: mySlice[index] = newValue.

Еще одна частая ошибка — получение указателя на переменную value в цикле. Так как переменная value одна на весь цикл и на каждой итерации в нее копируется новое значение, все указатели будут ссылаться на одно и то же место в памяти, которое в итоге будет содержать значение последнего элемента.

2. Классический цикл for с использованием len()

Этот способ похож на циклы в языках C или Java. Он полезен, когда нужно изменять элементы слайса или когда требуется более сложная логика управления индексом (например, итерация в обратном порядке).

package main

import "fmt"

func main() {
    mySlice := []string{"a", "b", "c"}
    for i := 0; i < len(mySlice); i++ {
        fmt.Printf("Индекс: %d, Значение: %sn", i, mySlice[i])
    }
}

Сравнение:

  • for...range: Предпочтителен для чтения данных из-за простоты и читаемости.
  • Классический for: Дает больше контроля над процессом итерации и является прямым способом для модификации элементов слайса.