Оператор break в языке Go

Операторы цикла в языке Go

В языке Go оператор break используется для завершения выполнения текущего цикла или оператора switch и выхода из блока кода этого цикла или оператора switch.

Оператор break может использоваться в следующих случаях:.

  • Он используется для выхода из цикла в операторе цикла и начала выполнения операторов после цикла.
  • Оператор break в операторе switch используется для выхода из оператора после выполнения одного case.
  • break можно применять в операторах select.
  • В нескольких циклах метка может использоваться для пометки цикла, из которого нужно выйти.

Синтаксис

Формат синтаксиса break следующий:

break

Блок-схема оператора break выглядит следующим образом:

Пример

Использование break в цикле for:

Пример

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // Выйти из цикла, когда i равно 5
        }
        fmt.Println(i)
    }
}

Результат вывода:

0
1
2
3
4

Выйти из цикла, когда переменная a больше 15:

Пример

package main

import "fmt"

func main() {
   /* Определить локальные переменные */
   var a int = 10

   /* цикл for */
   for a < 20 {
      fmt.Printf("Значение a равно : %d\n", a);
      a++
      if a > 15 {
         /* Используйте оператор break для выхода из цикла, когда a больше 15 */
         break
      }
   }
}

В приведённом выше примере, когда значение a больше 15, выполняется оператор break и весь цикл завершается. Результат выполнения:

a 的值为 : 10
a 的值为 : 11
a 的值为 : 12
a 的值为 : 13
a 的值为 : 14
a 的值为 : 15

В следующем примере есть несколько циклов, и он демонстрирует разницу между использованием меток и их отсутствием:

Пример

package main

import "fmt"

func main() {

   // без метки
   fmt.Println("---- break ----")
   for i := 1; i <= 3; i++ {
      fmt.Printf("i: %d\n", i)
      for i2 := 11; i2 <= 13; i2++ {
         fmt.Printf("i2: %d\n", i2)
         break
      }
   }

   // с использованием метки
   fmt.Println("---- break с меткой ----")
   re:
      for i := 1; i <= 3; i++ {
         fmt.Printf("i: %d\n", i)
         for i2 := 11; i2 <= 13; i2++ {
         fmt.Printf("i2: %d\n", i2)
         break re
      }
   }
}

Результат выполнения приведенного выше примера:

---- break ----
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11
---- break label ----
i: 1
i2: 11    

Использование break в операторе switch:

Пример

import "fmt"

func main() {
    day := "Вторник"
    switch day {
    case "Понедельник":
        fmt.Println("Сегодня понедельник.")
    case "Вторник":
        fmt.Println("Сегодня вторник.")
        break // Выход из оператора switch
    case "Среда":
        fmt.Println("Сегодня среда.")
    }
}

Результат вывода:

It's Tuesday.

Использование break в операторе select:

Пример

package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)

    go func() {
        time.Sleep(2 * time.Second)
        ch1 <- 1
    }()

    go func() {
        time.Sleep(1 * time.Second)
        ch2 <- 2
    }()

    select {
    case <-ch1:
        fmt.Println("Получено из ch1.")
    case <-ch2:
        fmt.Println("Получено из ch2.")
        break // Выйти из оператора select
    }
}

Результат вывода:

Received from ch2.

В языке Go применение оператора break в операторе select является относительно особенным. Из-за особенностей оператора select оператор break не может напрямую использоваться для выхода из самого оператора select, поскольку оператор select является неблокирующим и всегда будет ждать готовности всех коммуникационных операций. Если нужно досрочно завершить выполнение оператора select, можно использовать операторы return или goto для достижения того же эффекта.

В следующем примере показан случай использования return в операторе select для досрочного завершения выполнения:

Пример

package main

import (
    "fmt"
    "time"
)

func process(ch chan int) {
    for {
        select {
        case val := <-ch:
            fmt.Println("Получено значение:", val)
            // Выполнить некоторую логику
            if val == 5 {
                return // Досрочно завершить выполнение оператора select
            }
        default:
            fmt.Println("Значение ещё не получено.")
            time.Sleep(500 * time.Millisecond)
        }
    }
}

func main() {
    ch := make(chan int)

    go process(ch)

    time.Sleep(2 * time.Second)
    ch <- 1
    time.Sleep(1 * time.Second)
    ch <- 3
    time.Sleep(1 * time.Second)
    ch <- 5
    time.Sleep(1 * time.Second)
    ch <- 7

    time.Sleep(2 * time.Second)
}

В приведённом выше примере функция process использует оператор select в бесконечном цикле для ожидания данных в канале ch. Когда данные получены, выполняется некоторая логика. Когда полученное значение равно 5, используется return, чтобы досрочно завершить выполнение оператора select.

Результат вывода:

No value received yet.
No value received yet.
Received value: 1
No value received yet.
Received value: 3
No value received yet.
Received value: 5

Используя return, мы можем досрочно завершить выполнение оператора select и вернуться к коду вызывающей стороны.

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

Операторы цикла в языке Go

Другие расширения