цикл с диапазоном в Go - PullRequest
       11

цикл с диапазоном в Go

0 голосов
/ 06 июля 2018

Поправь меня, если я ошибаюсь, в Go только 3 типа петель.

Type1 (самый простой тип, с одним условием):

for i <= 3 {...}

Type2 (Классическая петля)

for j := 7; j <= 9; j++ {...}

Type3 (бесконечный цикл полагается на разрыв)

for {...break}

Затем я наткнулся на этот цикл for, который суммирует значение из массива

nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
    sum += num
}
fmt.Println("sum:", sum)//"sum: 9"

Можно ли считать вышеуказанное for-loop Type1 , где оно автоматически применяет <= и диапазон чисел как максимальное значение? Могу ли я каким-либо образом изменить значение? может мне нужны две лишние петли? Можем ли мы применить что-то вроде range + 2?

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Type1 будет работать почти как while на других языках. Поскольку в этом языке нет while, для которого он используется.

Type2 - это классический цикл for, как и в других языках, как вы указали.

Тип 3 используется для определения диапазона различных структур данных, таких как массивы, срезы, карты

Диапазон

для массивов и слайсов предоставляет индекс и значение для каждого запись, как в примере, который вы дали

nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
    sum += num
}
fmt.Println("sum:", sum)//"sum: 9"

диапазон на карте повторяется по парам ключ / значение.

kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
    fmt.Printf("%s -> %s\n", k, v)
}

диапазон строк перебирает кодовые точки Unicode. Первое значение начальный байтовый индекс руны и второй самой руны.

for i, c := range "go" {
    fmt.Println(i, c)
}

Для получения дополнительной информации, проверьте На примере веб-сайт для использования диапазона

0 голосов
/ 06 июля 2018

С Эффективное движение :

Цикл Go for похож на C, но не совпадает с ним. Он объединяет в течение и в то время, и нет никаких дел. Есть три формы, только одна из которых имеет точки с запятой.

// Like a C for
for init; condition; post { }

// Like a C while
for condition { }

// Like a C for(;;)
for { }

Продолжение:

Если вы зацикливаетесь на массиве, фрагменте, строке или карте или читаете из канала, предложение диапазона может управлять циклом.

for key, value := range oldMap {
        newMap[key] = value
}

Исходя из этого, я думаю о циклах range как о цикле for condition { }, где условие (такое, как оно есть) состоит в том, что переменные обозначаются как значения массива / среза / строки / map / chan не равны nil, хотя на практике даже явно nil значения работают

for _, v := range []interface{}{nil, nil, nil, nil} {
    // will still iterate four times
}

В действительности, было бы более полезно думать о цикле for Го как о контекстуальной комбинации цикла for init; condition; post в стиле C, классического цикла while и более современного foreach петля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...