Основы области видимости функций
Часть раздела Основы путешествия по GO на Coddy — урок 58 из 109.
В Go переменные, объявленные внутри функции, доступны только внутри этой функции. Это называется областью видимости функции.
Создайте функцию с локальной переменной:
func calculateTotal(price int, quantity int) int {
tax := 0.1 * float64(price * quantity) // локальная переменная
total := price * quantity + int(tax)
return total
}
func main() {
result := calculateTotal(10, 2)
fmt.Println("Total:", result)
// fmt.Println(tax) // Ошибка: tax здесь недоступна
}Вывод показывает только возвращаемое значение:
Total: 22Переменная tax существует только внутри функции calculateTotal и к ней нельзя получить доступ из main.
Задание
НовичокВ этом испытании вы попрактикуетесь в понимании области видимости функций в Go. Вам нужно исправить простую программу, в которой есть проблема с областью видимости.
В программе есть глобальная переменная message и функция, которая пытается её изменить. Ваша задача — исправить код так, чтобы функция правильно обновляла глобальную переменную.
Шпаргалка
Переменные, объявленные внутри функции, доступны только внутри этой функции (область видимости функции):
func calculateTotal(price int, quantity int) int {
tax := 0.1 * float64(price * quantity) // локальная переменная
total := price * quantity + int(tax)
return total
}
func main() {
result := calculateTotal(10, 2)
fmt.Println("Total:", result)
// fmt.Println(tax) // Ошибка: tax здесь недоступна
}Локальные переменные существуют только внутри своей функции и не могут быть доступны извне.
Попробуйте сами
package main
import "fmt"
// Глобальная переменная
var message string = "Hello from global scope"
func updateMessage() {
// Это создает новую локальную переменную вместо изменения глобальной
message := "Hello from function scope"
fmt.Println("Inside function:", message)
}
func main() {
fmt.Println("Before function call:", message)
updateMessage()
// TODO: Глобальное сообщение все еще имеет исходное значение
// Измените функцию updateMessage(), чтобы изменить глобальную переменную
fmt.Println("After function call:", 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`Итоги — Принятие решений