Menu
CoddyTech

Затенение переменных в `if`

Часть раздела Основы путешествия по GO на Coddy. Урок 37 из 109.

Давайте узнаем о затенении переменных в условных операторах if. Условный оператор if может объявить переменную перед своим условием, и эта переменная существует только внутри блока if и связанных с ним блоков else. Если её имя совпадает с именем переменной вне if, она затеняет (скрывает) внешнюю переменную внутри этих блоков.

Сначала создадим переменную вне условного оператора:

x := 10
fmt.Println("Original x value:", x)

После выполнения этого кода у нас будет переменная x со значением 10, которую мы сможем использовать во всей программе.

Теперь давай объявим новую переменную y в инструкции if. Она существует только внутри блоков if и else:

if y := x * 2; y > 15 {
    fmt.Println("y is greater than 15:", y)
    // y существует только в этом блоке
} else {
    fmt.Println("y is not greater than 15:", y)
    // y также доступна в блоках else
}

После выполнения этого кода Go вычислит y как 20 (то есть x * 2), проверит, больше ли это значение 15, а затем выполнит первый блок. На экране появится вывод:

y is greater than 15: 20

Наконец, давай попробуем обратиться к нашим переменным после оператора if:

// fmt.Println(y) вызвал бы ошибку — y здесь не существует
fmt.Println("x is still:", x)

После выполнения этого кода мы всё ещё можем получить доступ к x, но y больше недоступна, потому что она существовала только внутри блоков if и else. Вывод отобразится на экране:

x is still: 10

Здесь показана область видимости переменной, объявленной в операторе if: переменная y доступна только внутри условных блоков, в которых она была объявлена. Внешней переменной y нет, поэтому здесь ничего не затеняется. Если бы вместо неё мы назвали переменную x, она затенила бы внешнюю x внутри этих блоков, а после них значение внешней x по-прежнему было бы равно 10.

challenge icon

Задание

Новичок

В этом задании ты потренируешься затенять переменные в операторе if. Ты увидишь, как переменная, объявленная внутри блока if, может иметь то же имя, что и переменная во внешней области видимости, но другое значение.

В коде есть переменная message во внешней области видимости. Твоя задача — создать затенённую переменную с тем же именем внутри блока if, а затем вывести значения обеих переменных, чтобы увидеть эффект затенения.

Попробуйте сами

package main

import "fmt"

func main() {
	// Переменная внешней области видимости
	message := "Hello from outer scope"
	
	isLoggedIn := true
	
	if isLoggedIn {
		// TODO: Создайте новую переменную с именем 'message' и значением "Hello from inner scope"
		
		// Здесь выводится сообщение из внутренней области видимости
		fmt.Println(message)
	}
	
	// Здесь выводится сообщение из внешней области видимости
	fmt.Println(message)
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Онлайн-компилятор Go