Основы Golang — Управление потоком — Дополнение


Этот пост является частью серии статей, в которых я собираюсь поделиться основными принципами разработки на GoLang.
Эта конкретная статья является дополнением к основам Golang — Flow Control

Теперь, когда мы увидели, как использовать IF, SWITCH и FOR, давайте рассмотрим некоторые зарезервированные слова Go, которые используются для прерывания или ускорения итерации кода.

продолжить

Зарезервированное слово continue специально предназначено для использования с for и используется для перехода к следующей итерации:

func main() {
    produtos := []produto{
        {
            nome:   "Produto Final",
            cor:    verde,
            status: publicado,
            criado: time.Now(),
        },
        {
            nome:   "Produto Teste",
            cor:    verde,
            status: rascunho,
            criado: time.Now(),
        },
    }

    for _, p := range produtos {
        if p.status == publicado {
            continue
        }
        fmt.Println(p)
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Выполнив этот код, вы увидите, что в for выводится только Product Test.

перерыв

Это зарезервированное слово может использоваться в for, switch и select. И служит для остановки итерации блока и перехода к следующей инструкции в коде.

// nesse for nenhum produto será impresso
for _, p := range produtos {
    if p.status == publicado {
        break
    }
    fmt.Println(p)
}
fmt.Println("Loop terminado")
Войдите в полноэкранный режим Выход из полноэкранного режима
p := produto{
    nome:   "Produto Teste",
    cor:    verde,
    status: rascunho,
    criado: time.Now(),
}
// nenhum case será executado
switch p.status {
case publicado:
    fmt.Println("bloco publicado", p)
case rascunho:
    if p.cor == verde {
        break
    }
    fmt.Println("bloco rascunho", p)
case congelado:
    fmt.Println("bloco congelado", p)
}
fmt.Println("switch terminado")
Войдите в полноэкранный режим Выход из полноэкранного режима

провал

Это специально для использования с switch, в Go каждый case из switch уникален. В отличие от других языков, в которых, если вам нужно исключение, вам нужно комбинировать case + break.
Но если вам нужно запустить один и тот же случай для более чем одного условия, вы можете воспользоваться fallthrough, который передает управление на следующий case:

// nesse exemplo ambos os cases serão executados
switch p.status {
case rascunho:
    fmt.Println("bloco rascunho")
    fallthrough
case congelado:
    fmt.Println("bloco congelado")
    fmt.Println("aplica lógica compartilhada entre produtos congelados e rascunhos")
}
fmt.Println("switch terminado")
Войдите в полноэкранный режим Выход из полноэкранного режима

Пометка с помощью continue и break

В коде Go блоки могут иметь метки, и мы можем комбинировать использование управляющих зарезервированных слов с метками. Это оказывается полезным, когда у нас есть вложенные операции. Например:

func main() {
    produtos := []produto{
        {
            nome:   "Produto Final",
            cor:    verde,
            status: publicado,
            criado: time.Now(),
        },
        {
            nome:   "Produto Teste",
            cor:    verde,
            status: rascunho,
            criado: time.Now(),
        },
    }

    for _, p := range produtos {
        switch p.status {
        case publicado:
            break
        case rascunho:
            fmt.Println("bloco rascunho")
            fallthrough
        case congelado:
            fmt.Println("aplica lógica compartilhada entre produtos congelados e rascunhos")
        }
        fmt.Println("aplica regra para produtos não publicados")
    }
    fmt.Println("Loop terminado")

}
Войдите в полноэкранный режим Выход из полноэкранного режима

Если вы запустите код, то заметите, что переключатель break не прерывает выполнение for. С использованием метки это выглядит следующим образом:

loopDeProduto:
    for _, p := range produtos {
        switch p.status {
        case publicado:
            break loopDeProduto
        case rascunho:
            fmt.Println("bloco rascunho")
            fallthrough
        case congelado:
            fmt.Println("aplica lógica compartilhada entre produtos congelados e rascunhos")
        }
        fmt.Println("aplica regra para produtos não publicados")
    }
    fmt.Println("Loop terminado")
Войдите в полноэкранный режим Выход из полноэкранного режима

То есть, с помощью метки вы можете управлять итерацией for внутри switch. Но это могут быть и два вложенных for, или любой другой вложенный блок.

О существовании этих функций контроля важно знать, но, на мой взгляд, их вполне можно избежать.
Вообще, когда вы выполняете вложенные операции и нуждаетесь в таком детальном контроле, это большой знак того, что, возможно, ваш код не так прост.
Всегда учитывайте выразительность кода, не заставляйте его работать любой ценой!

Резюме

  • Ярлыки позволяют управлять вложенными блоками.
  • Всегда учитывайте выразительность вашего кода.

Оцените статью
Procodings.ru
Добавить комментарий