> Что такое функция (Go)

Уровень: junior · Роль: backend · Категория: Технические вопросы

Компании: Лукойл

Стек: Go

> Пример ответа

Короткий ответ

Функция - это именованный блок кода, который можно вызывать многократно. Она принимает входные параметры, выполняет определённые действия и возвращает результат. В Go функции объявляются с ключевым словом func, поддерживают множественные возвращаемые значения и могут быть переданы как значения. Функции - базовый механизм декомпозиции программы на переиспользуемые части.

Подробное объяснение

Функция в программировании - это абстракция, которая группирует последовательность инструкций под одним именем. Основные характеристики:

  • Сигнатура - имя, список параметров с типами и возвращаемые типы
  • Параметры - входные данные, которые функция принимает
  • Возвращаемое значение - результат работы функции (в Go может быть несколько)
  • Область видимости - переменные, объявленные внутри функции, локальны для неё

В Go функции - это значения первого класса: их можно присваивать переменным, передавать в другие функции и возвращать из функций. Это позволяет реализовывать паттерны вроде callbacks и замыканий.

Функции решают три ключевые задачи: переиспользование кода, декомпозиция сложных задач и изоляция состояния. В отличие от методов, функции не привязаны к типу - методы в Go - это функции с ресивером.

На практике

В backend-разработке на Go функции используются повсеместно:

  • Обработчики HTTP-запросов - функции с сигнатурой func(w http.ResponseWriter, r *http.Request)
  • Middleware - функции, оборачивающие другие функции
  • Абстракция бизнес-логики - сервисные функции, которые вызываются из handlers
  • Утилитарные функции для валидации, форматирования, работы с данными

Важно проектировать функции так, чтобы они делали одну вещь и делали её хорошо. Это упрощает тестирование и поддержку кода. В Go принято возвращать ошибку как последнее возвращаемое значение - это стандартный паттерн обработки ошибок.

Пример кода

GO
package main
import "fmt"
// Функция с одним возвращаемым значением
func add(a int, b int) int {
return a + b
}
// Функция с несколькими возвращаемыми значениями
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("division by zero")
}
return a / b, nil
}
// Функция как значение (callback)
func applyOperation(x int, y int, op func(int, int) int) int {
return op(x, y)
}
// Замыкание
func multiplier(factor int) func(int) int {
return func(x int) int {
return x * factor
}
}
func main() {
sum := add(2, 3)
fmt.Println(sum) // 5
result, err := divide(10, 2)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result) // 5
}
fmt.Println(applyOperation(4, 5, add)) // 9
double := multiplier(2)
fmt.Println(double(10)) // 20
}

Как отвечать на собеседовании

Начни с простого определения, затем добавь детали, специфичные для Go. Структура ответа:

  1. Базовое определение - блок кода с именем, параметрами и возвращаемым значением
  2. Упомяни синтаксис func и множественные возвращаемые значения
  3. Добавь про функции как значения первого класса - это сильная сторона Go
  4. Приведи пример из реальной практики: HTTP handler или middleware
  5. Если спросят про методы - уточни, что метод отличается от функции наличием ресивера

Не углубляйся в теорию без запроса. Держи ответ в рамках 1-2 минут. Если интервьюер хочет больше деталей - он задаст уточняющий вопрос.

Что проверяет интервьюер

Интервьюер оценивает:

  • Понимание базовой концепции функции - не просто заученное определение, а осознание назначения
  • Знание синтаксиса Go - корректное описание сигнатуры, возвращаемых значений
  • Понимание отличий функций в Go от других языков - множественные возвращаемые значения, отсутствие перегрузки, функции как значения
  • Умение объяснить практическое применение - где в реальном коде используются функции
  • Способность говорить структурированно и по существу

Для junior-позиции достаточно уверенного владения базой. Глубокие вопросы про замыкания или defer обычно задают на более высоких уровнях.

Типичные ошибки

  • Путаница между функцией и методом - метод привязан к типу через ресивер, функция - нет
  • Утверждение, что в Go есть перегрузка функций - это не так, имя функции должно быть уникальным в пакете
  • Забывают упомянуть множественные возвращаемые значения - ключевая особенность Go
  • Неправильное описание области видимости - переменные внутри функции не видны снаружи
  • Слишком абстрактный ответ без примеров - интервьюеру важно видеть, что кандидат писал реальный код
  • Попытка рассказать всё сразу - лучше ответить на заданный вопрос и дать возможность задать следующий

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью