Затенение переменных в `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.
Задание
НовичокВ этом задании ты потренируешься затенять переменные в операторе 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)
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Операторы сравнения и логические операторы
Операторы сравнения — Часть 1Операторы сравнения — Часть 2Логический оператор ANDЛогический оператор ORЛогический оператор NOTОсновы приоритета операторовИтоги: выполнение сравнений7Управляющие конструкции: Циклы
Что такое цикл `for`Цикл `for` — основыЦикл `for` — только условиеКлючевое слово `break`Ключевое слово `continue`Вложенные циклыИтоги — повторение действий2Переменные и базовые типы данных
Что такое переменнаяВывод типов с помощью `:=`Целые числа (int)Числа с плавающей точкойЛогический тип (Booleans)СтрокиНулевые значения (Zero Values)КонстантыПравила именованияИтоги: переменные и типы5Основы ввода-вывода
Форматированный выводСпецификаторы форматаВывод типовБазовый ввод данных пользователемИтоги: ввод и вывод8Функции
Понимание функцийОбъявление функцииВызов функцийПараметры функцииВозврат одного значенияВозврат нескольких значенийИменованные возвращаемые значенияОсновы области видимости функцийИтоги — создание переиспользуемого кода3Базовые операторы
Арифметические операторыОператор деленияОператор остатка от деленияОператор присваиванияКомбинированные операторы присваиванияИнкремент и декрементПовторение — Вычисления6Управление потоком: Условные конструкции
Оператор `if`Ключевое слово `else`Ключевое слово `else if`Затенение переменных в `if`Инициализация переменныхОператор `switch`Switch с выражениямиSwitch без выраженийКлючевое слово `fallthrough`Итоги — Принятие решенийПотренируйтесь самостоятельно: Онлайн-компилятор Go