Практика: Функции
Онлайн редактор кода для Go
Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1: Простая функция с одним возвращаемым значением
Задание 1: Вычисление площади фигуры
Напишите функцию, возвращающую площадь геометрической фигуры.
💡 Подсказка
Не забудьте импортировать "math" для math.Pi и других функций (например, math.Tan, math.Sqrt).
Для вывода используйте fmt.Printf("Площадь: %.2f\n", result) — это даст красивый формат с двумя знаками после запятой.
Задание 2: Функция с несколькими возвращаемыми значениями
Задание 2: Площадь и периметр
Функция возвращает площадь и периметр (или длину окружности).
💡 Подсказка
Используйте именованные возвращаемые значения: (area, perimeter float64). Тогда можно присваивать им значения в теле функции и завершить return без аргументов (голый return).
Для формулы Герона: полупериметр s = (a+b+c)/2, площадь = √(s(s-a)(s-b)(s-c)).
Задание 3: Функция с указателями
Задание 3: Изменение значения по указателю
Функция изменяет переданное значение.
💡 Подсказка
Чтобы изменить значение — разыменовывайте указатель: *v = *v * 2 или *v += amount.
В main передавайте адрес: functionName(&variable). После вызова выводите изменённую переменную.
Задание 4: Вариадическая функция
Задание 4: Вариадическая функция для вычислений
Функция принимает любое количество аргументов.
💡 Подсказка
Внутри функции параметр nums ...int ведёт себя как слайс []int — используйте range для перебора.
Если аргументов нет — сумма/произведение/среднее должно быть 0 (или 1 для произведения).
Тестируйте несколько вызовов в main с разным количеством аргументов.
Задание 5: defer для логирования
Задание 5: Функция с defer-логом завершения
Добавьте defer с сообщением о завершении.
💡 Подсказка
Используйте анонимную функцию в defer, чтобы передать параметры: defer func() .{ fmt.Printf("Платёж %d обработан\n", id) }()
Если просто defer fmt.Println(id) — значение id будет взято на момент выполнения defer, а не объявления (может быть неожиданным).
Вывод от defer появится в конце, после основного тела функции.
Задание 6: Замыкание — фабрика счётчиков
Задание 6: Фабрика счётчиков через замыкание
Функция возвращает счётчик.
💡 Подсказка
Внешняя функция создаёт переменную (например, count := start), а возвращает func() int .{count += step; return count }
Каждый вызов фабрики создаёт независимое замыкание — свои переменные не пересекаются.
В main создайте 2–3 счётчика и вызовите несколько раз, чтобы показать независимость.
Задание 7: Анонимные функции
Задание 7: Анонимная функция с немедленным вызовом
Создайте и сразу выполните анонимную функцию.
💡 Подсказка
Синтаксис немедленного вызова: func(параметры) .{ тело }()
Если нужно использовать внешние переменные — они доступны внутри анонимной функции (замыкание).
Для возврата значения присвойте в переменную: .result := func(x int) int { return x * x }(5)
Задание 8: Функции высшего порядка
Задание 8: Функция, принимающая другую функцию
Реализуйте функцию высшего порядка.
💡 Подсказка
Тип функции как параметра: func(int) int или func(float64, float64) float64.
В main передавайте анонимную функцию: ApplyTwice(5, func(x int) int .{ return x + 1 })
Для композиции: return func(x int) int .{ return f(g(x)) }
Задание 9: Named return + defer модификация
Задание 9: Named return с изменением в defer
Используйте named return и defer для изменения результата.
💡 Подсказка
Объявите func Name() (result float64). Присвойте result = 1000, затем defer func() .{ result *= 1.20 }()
Defer выполнится после вычисления return, но до фактического возврата — поэтому может изменить named переменные.
Завершайте функцию просто return.
Задание 10: Комбинированное — всё вместе
Задание 10: Полный мини-калькулятор
Объедините: variadic, указатели, несколько возвратов, defer, замыкание.
💡 Подсказка
Сочетайте всё: variadic для входных данных, указатель для изменения баланса, named returns для суммы и количества, defer для финального лога.
Можно создать замыкание, которое использует указатель на баланс и добавляет суммы из variadic.
Главное — показать, как все изученные механизмы работают вместе в одной программе.
Дополнительные материалы
После выполнения заданий:
- Поиграйтесь с порядком defer
- Создайте свои фабрики и замыкания
- Экспериментируйте с named returns
Функции — это строительные блоки. Делайте их маленькими, понятными и переиспользуемыми.
Управляющие конструкции (if, for, switch).