Существует ли цикл foreach в Go?
Есть ли в языке Go конструкция foreach
? Могу ли я итеративно обрабатывать срез или массив, используя for
?
5 ответ(ов)
В Go существует синтаксис, похожий на foreach
, который поддерживает массивы, срезы, карты и каналы.
Итерация по массиву или срезу:
// индекс и значение
for i, v := range slice {}
// только индекс
for i := range slice {}
// только значение
for _, v := range slice {}
Итерация по карте:
// ключ и значение
for key, value := range theMap {}
// только ключ
for key := range theMap {}
// только значение
for _, value := range theMap {}
Итерация по каналу:
for v := range theChan {}
Итерировать по каналу — значит получать данные из канала до его закрытия:
for {
v, ok := <-theChan
if !ok {
break
}
}
Вот пример кода, демонстрирующий использование конструкции foreach в Go:
package main
import (
"fmt"
)
func main() {
arrayOne := [3]string{"Apple", "Mango", "Banana"}
for index, element := range arrayOne {
fmt.Println(index)
fmt.Println(element)
}
}
Этот код выведет индексы и значения элементов массива arrayOne
. Вы можете запустить этот пример по следующей ссылке: https://play.golang.org/p/LXptmH4X_0.
Да, range:
Форма for
с использованием range
перебирает срез или карту.
При переборе среза возвращаются два значения для каждой итерации. Первое — это индекс, а второе — копия элемента по этому индексу.
Пример:
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
for i := range pow {
pow[i] = 1 << uint(i) // == 2**i
}
for _, value := range pow {
fmt.Printf("%d\n", value)
}
}
- Вы можете пропустить индекс или значение, присвоив их
_
. - Если вам нужен только индекс, просто уберите
,
и значение полностью.
Да, вы можете использовать range
, не ссылаясь на его возвращаемые значения, используя for range
с вашим типом. Вот пример на Go:
arr := make([]uint8, 5)
i, j := 0, 0
for range arr {
fmt.Println("Цикл по массиву", i)
i++
}
for range "bytes" {
fmt.Println("Цикл по строке", j)
j++
}
В этом коде мы создаем массив arr
с пятью элементами и используем for range
, чтобы пройти по нему. Переменная i
увеличивается в каждом проходе, и выводится текущее значение. То же самое происходит и для строки "bytes" во втором цикле, где переменная j
увеличивается. Этот способ позволяет вам итерироваться по элементам, не обращаясь к их значениям, что может быть полезно, если вам нужно просто выполнить какое-то действие определенное количество раз.
Ваш вопрос о том, как работает range
в Go, совершенно обоснованный. Действительно, при использовании range
создается копия элементов, которые вы итерируете. Это означает, что если вы изменяете содержимое элемента в for range
, то изменения не затронут оригинальные значения в контейнере.
Если вам необходимо изменить значения в оригинальном массиве или срезе, вам стоит использовать традиционный цикл for
с индексом, который вы увеличиваете, и разыменовывать ссылку на индексированный элемент. Пример кода для этого будет выглядеть так:
for i := 0; i < len(arr); i++ {
element := &arr[i]
element.Val = newVal
}
Таким образом, вы напрямую изменяете значения в оригинальной структуре данных.
Как удалить последний символ из строки в JavaScript?
Как проверить, содержит ли карта ключ в Go?
Как эффективно объединять строки в Go
Как вывести переменные структуры в консоль?
PHP: Как определить первую и последнюю итерацию в цикле foreach?