Затенение переменных

Затенение (shadowing) переменных в Go - это ситуация, при которой во вложенной области видимости объявляется переменная с именем, уже существующим во внешней области. В результате вложенная переменная "затеняет" внешнюю, и все обращения к этому имени во внутренней области будут относиться к новой переменной. Это важный механизм, который следует понимать, чтобы избегать неожиданного поведения в коде.

Синтаксис

go// Объявление переменной во внешней области
x := 10

// Во вложенной области объявляется переменная с тем же именем
if x := 20; x > 10 {
  // Здесь x = 20, внешняя x затенена
  fmt.Println(x)
}
// Здесь x = 10, внешняя переменная снова доступна

Пример с функцией

Рассмотрим пример, где переменная в функции затеняет глобальную переменную:

gopackage main

import "fmt"

var value int = 5

func main() {
  fmt.Println("Global value:", value)

  value := 10
  fmt.Println("Local value:", value)
}

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

go"Global value: 5"
"Local value: 10"

Пример с блоком if

Затенение может происходить внутри блоков, таких как if, for или switch. В этом примере создается новая переменная внутри блока if:

gopackage main

import "fmt"

func main() {
  x := 15
  fmt.Println("Before if block:", x)

  if x := 25; x > 20 {
    fmt.Println("Inside if block:", x)
  }

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

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

go"Before if block: 15"
"Inside if block: 25"
"After if block: 15"

Пример с циклом for

В этом примере переменная внутри цикла for затеняет переменную из внешней области:

gopackage main

import "fmt"

func main() {
  index := 0
  fmt.Println("Before loop:", index)

  for index := 0; index < 3; index++ {
    fmt.Println("Inside loop:", index)
  }

  fmt.Println("After loop:", index)
}

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

go"Before loop: 0"
"Inside loop: 0"
"Inside loop: 1"
"Inside loop: 2"
"After loop: 0"

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