Область видимости блока

Область видимости блока в Go определяет, где доступны переменные, объявленные внутри фигурных скобок ({ ... }). Переменные, объявленные внутри блока, видны только в пределах этого блока и во всех вложенных блоках. За пределами блока эти переменные недоступны.

Синтаксис

go{
  // переменная видна только внутри этого блока
  var x int = 10
}
// здесь x недоступна

Пример

Рассмотрим простой пример: объявим переменную внутри блока условия и попробуем использовать её снаружи:

gopackage main

import "fmt"

func main() {
  if true {
    x := 100
    fmt.Println("Inside block:", x)
  }
  // fmt.Println(x) // ошибка: x не определена вне блока
  fmt.Println("Outside block")
}

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

go"Inside block: 100"
"Outside block"

Пример

Область видимости блока также работает для циклов. Переменная, объявленная в инициализации цикла, видна только внутри цикла:

gopackage main

import "fmt"

func main() {
  for i := 0; i < 3; i++ {
    fmt.Println("i inside loop:", i)
  }
  // fmt.Println(i) // ошибка: i не определена вне цикла
  fmt.Println("Loop finished")
}

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

go"i inside loop: 0"
"i inside loop: 1"
"i inside loop: 2"
"Loop finished"

Пример

Переменные, объявленные во вложенных блоках, могут переопределять переменные из внешних блоков (shadowing):

gopackage main

import "fmt"

func main() {
  x := "outer"
  fmt.Println("Before inner block:", x)

  {
    x := "inner"
    fmt.Println("Inside inner block:", x)
  }

  fmt.Println("After inner block:", x)
}

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

go"Before inner block: outer"
"Inside inner block: inner"
"After inner block: outer"

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

  • область видимости пакета package-scope,
    которая определяет доступность переменных на уровне пакета
  • область видимости функции function-scope,
    которая охватывает всю функцию
  • затенение переменных shadowing,
    которое позволяет переопределять переменные во вложенных блоках
  • область видимости файла file-scope,
    которая ограничивает видимость импортов