Sentencia break en Go

Go 语言循环语句Sentencias de bucle en Go

En Go, la sentencia break se utiliza para terminar la ejecución del bucle actual o de la sentencia switch, y salir del bloque de código de ese bucle o sentencia switch.

La sentencia break se puede usar en los siguientes aspectos:

  • Se usa en sentencias de bucle para salir del bucle y comenzar a ejecutar las sentencias posteriores al bucle.
  • break en la sentencia switch tiene la función de salir de la sentencia después de ejecutar un case.
  • break se puede aplicar en la sentencia select.
  • En bucles múltiples (anidados), se puede usar una etiqueta (label) para indicar el bucle del que se desea salir con break.

Sintaxis

La sintaxis de break es la siguiente:

break

El diagrama de flujo de la sentencia break es el siguiente:

Ejemplo

Usar break en un bucle for:

Ejemplo

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // Cuando i sea igual a 5, sale del bucle
        }
        fmt.Println(i)
    }
}

Resultado:

0
1
2
3
4

Salir del bucle cuando la variable a sea mayor que 15:

Ejemplo

package main

import "fmt"

func main() {
   /* Definir variables locales */
   var a int = 10

   /* Bucle for */
   for a < 20 {
      fmt.Printf("El valor de a es : %d\n", a);
      a++
      if a > 15 {
         /* Cuando a sea mayor que 15, usa la sentencia break para salir del bucle */
         break
      }
   }
}

En el ejemplo anterior, cuando el valor de a es mayor que 15, se ejecuta la sentencia break y todo el bucle se termina. El resultado de la ejecución es:

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

El siguiente ejemplo tiene bucles múltiples y demuestra la diferencia entre usar una etiqueta y no usarla:

Ejemplo

package main

import "fmt"

func main() {

   // Sin usar etiqueta
   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
      }
   }

   // Usando etiqueta
   fmt.Println("---- break label ----")
   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
      }
   }
}

El resultado de ejecutar el ejemplo anterior es:

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

Usar break en una sentencia switch:

Ejemplo

import "fmt"

func main() {
    day := "Tuesday"
    switch day {
    case "Monday":
        fmt.Println("It's Monday.")
    case "Tuesday":
        fmt.Println("It's Tuesday.")
        break // Salir de la sentencia switch
    case "Wednesday":
        fmt.Println("It's Wednesday.")
    }
}

Resultado:

It's Tuesday.

Usar break en una sentencia select:

Ejemplo

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("Received from ch1.")
    case <-ch2:
        fmt.Println("Received from ch2.")
        break // Salir de la sentencia select
    }
}

Resultado:

Received from ch2.

En Go, la aplicación de la sentencia break en la sentencia select es relativamente especial. Debido a las características de la sentencia select, break no se puede usar directamente para salir de la propia sentencia select, porque select es no bloqueante y espera a que todas las operaciones de comunicación estén listas. Si se necesita finalizar la ejecución de la sentencia select antes de tiempo, se pueden usar las sentencias return o goto para lograr el mismo efecto.

El siguiente ejemplo muestra el uso de return en una sentencia select para finalizar la ejecución antes de tiempo:

Ejemplo

package main

import (
    "fmt"
    "time"
)

func process(ch chan int) {
    for {
        select {
        case val := <-ch:
            fmt.Println("Received value:", val)
            // Ejecutar algo de lógica
            if val == 5 {
                return // Terminar prematuramente la ejecución de la sentencia select
            }
        default:
            fmt.Println("No value received yet.")
            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)
}

En el ejemplo anterior, la función process usa una sentencia select en un bucle infinito para esperar datos en el canal ch. Cuando recibe datos, ejecuta alguna lógica. Cuando el valor recibido es igual a 5, usa return para finalizar la ejecución de la sentencia select antes de tiempo.

Resultado:

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

Al usar return, podemos terminar la ejecución anticipadamente en la sentencia select y volver al código del llamador.

Es importante tener en cuenta que usar la sentencia return termina inmediatamente la ejecución de la función actual, por lo que debes decidir según tus necesidades reales qué método usar para finalizar la ejecución anticipadamente en la sentencia select.

Go 语言循环语句Sentencias de bucle en Go

Otras extensiones