вторник, 22 января 2019 г.

Эффективный Go: цикл for

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

// Как C for
for init; condition; post { }

// Как C while
for condition { }
// Как C for(;;)
for { }

Короткие объявления позволяют легко объявить переменную индекса прямо в цикле.

sum := 0
for i := 0; i < 10; i++ {
    sum += i
}

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

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

Если вам нужен только первый элемент в диапазоне (ключ или индекс), отбросьте второй:

for key := range m {
    if key.expired() {
        delete(m, key)
    }
}

Если вам нужен только второй элемент в диапазоне (значение), используйте пустой идентификатор, подчеркивание, чтобы отбросить первый:

sum := 0
for _, value := range array {
    sum += value
}

Пустой идентификатор имеет множество применений.

Для строк range делает большую часть работы за вас, выделяя отдельные Unicode символы путем разбора UTF-8. Ошибочные кодировки занимают один байт и производят замещающующий rune U+FFFD. (Имя (со связанным встроенным типом) rune - это терминология Go для единичного Unicode кодированного символа.) Цикл

// \x80 это невалидное UTF-8 кодирование
for pos, char := range "日本\x80語" { 
    fmt.Printf("character %#U starts 
               at byte position %d\n", char, pos)
}

печатает

character U+65E5 '日' starts at byte position 0
character U+672C '本' starts at byte position 3
character U+FFFD '�' starts at byte position 6
character U+8A9E '語' starts at byte position 7

Наконец, в Go нет оператора запятой, а также ++ и -- являются заявлениями, а не выражениями. Таким образом, если вы хотите запустить несколько переменных в for Вы должны использовать параллельное присваивание (хотя это исключает ++ и --).

// Reverse a
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
    a[i], a[j] = a[j], a[i]
}


Читайте также:


Комментариев нет:

Отправить комментарий