7

Существует ли цикл foreach в Go?

2

Есть ли в языке Go конструкция foreach? Могу ли я итеративно обрабатывать срез или массив, используя for?

5 ответ(ов)

2

В 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
    }
}
0

Вот пример кода, демонстрирующий использование конструкции 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.

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)
    }
}
  • Вы можете пропустить индекс или значение, присвоив их _.
  • Если вам нужен только индекс, просто уберите , и значение полностью.
0

Да, вы можете использовать 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 увеличивается. Этот способ позволяет вам итерироваться по элементам, не обращаясь к их значениям, что может быть полезно, если вам нужно просто выполнить какое-то действие определенное количество раз.

0

Ваш вопрос о том, как работает range в Go, совершенно обоснованный. Действительно, при использовании range создается копия элементов, которые вы итерируете. Это означает, что если вы изменяете содержимое элемента в for range, то изменения не затронут оригинальные значения в контейнере.

Если вам необходимо изменить значения в оригинальном массиве или срезе, вам стоит использовать традиционный цикл for с индексом, который вы увеличиваете, и разыменовывать ссылку на индексированный элемент. Пример кода для этого будет выглядеть так:

for i := 0; i < len(arr); i++ {
    element := &arr[i]
    element.Val = newVal
}

Таким образом, вы напрямую изменяете значения в оригинальной структуре данных.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь