Ответ
В 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
: Дает больше контроля над процессом итерации и является прямым способом для модификации элементов слайса.