Оператор goto

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

Синтаксис

gogoto label
// ...
label:
// код после метки

Пример

Давайте используем оператор goto для создания простого цикла, который выводит числа от 1 до 5:

gopackage main

import "fmt"

func main() {
  i := 1
  start:
    if i > 5 {
      goto end
    }
    fmt.Println(i)
    i++
    goto start
  end:
    fmt.Println("Loop finished")
}

Результат выполнения кода:

go1
2
3
4
5
"Loop finished"

Пример

Давайте используем goto для выхода из вложенного цикла при выполнении определенного условия:

gopackage main

import "fmt"

func main() {
  for i := 0; i < 5; i++ {
    for j := 0; j < 5; j++ {
      if i == 2 && j == 2 {
        goto found
      }
      fmt.Printf("i=%d, j=%d\n", i, j)
    }
  }
  fmt.Println("Not found")
  return

  found:
    fmt.Println("Found at i=2, j=2")
}

Результат выполнения кода:

go"i=0, j=0"
"i=0, j=1"
"i=0, j=2"
"i=0, j=3"
"i=0, j=4"
"i=1, j=0"
"i=1, j=1"
"i=1, j=2"
"i=1, j=3"
"i=1, j=4"
"i=2, j=0"
"i=2, j=1"
"Found at i=2, j=2"

Пример

Давайте продемонстрируем, что оператор goto не может перепрыгивать через объявление переменных:

gopackage main

import "fmt"

func main() {
  goto skip
  x := 10
  skip:
    // x не доступна здесь, так как объявление пропущено
    fmt.Println("Skipped variable declaration")
    // fmt.Println(x) // Это вызовет ошибку компиляции
}

Результат выполнения кода:

go"Skipped variable declaration"

Смотрите также

  • оператор break,
    который прерывает выполнение цикла
  • оператор continue,
    который пропускает текущую итерацию цикла
  • оператор switch,
    который выполняет выбор из нескольких вариантов
  • оператор return,
    который завершает выполнение функции