Перейти к основному содержимому

Практика: Функции


Онлайн редактор кода для 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).