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

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

Компании: Radium Finance

Стек: Go

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

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

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

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

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

Ключевая особенность - замыкание (closure): анонимная функция захватывает переменные из окружающей области видимости по ссылке. Это значит, что изменения этих переменных внутри функции видны снаружи, и наоборот. Замыкание сохраняет доступ к переменным даже после выхода из внешней функции.

Анонимные функции часто используются:

  • как аргументы для функций высшего порядка (например, sort.Slice);
  • для запуска горутин с параметрами;
  • в defer для выполнения нескольких операций;
  • для создания фабрик функций.

На практике

В реальном коде анонимные функции встречаются повсеместно. Например, при сортировке слайса структур через sort.Slice - там передаётся анонимная функция сравнения. При работе с HTTP-обработчиками часто используют замыкания для передачи конфигурации или зависимостей.

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

Также анонимные функции удобны для немедленного вызова (IIFE) - например, для инициализации переменной с логикой, которую не хочется выносить в отдельную функцию.

Пример кода

GO
package main
import (
"fmt"
"sort"
)
func main() {
// Простое присваивание анонимной функции
add := func(a, b int) int {
return a + b
}
fmt.Println(add(2, 3)) // 5
// Немедленный вызов (IIFE)
msg := func(name string) string {
return "Hello, " + name
}("Alice")
fmt.Println(msg) // Hello, Alice
// Замыкание: счётчик
counter := func() func() int {
count := 0
return func() int {
count++
return count
}
}()
fmt.Println(counter()) // 1
fmt.Println(counter()) // 2
// Использование в sort.Slice
nums := []int{3, 1, 2}
sort.Slice(nums, func(i, j int) bool {
return nums[i] < nums[j]
})
fmt.Println(nums) // [1 2 3]
// Горутина с параметром
done := make(chan bool)
go func(n int) {
fmt.Println("goroutine:", n)
done <- true
}(42)
<-done
}

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

Начни с определения: анонимная функция - функция без имени, объявленная через литерал func. Затем покажи синтаксис и объясни замыкание - это ключевой момент. Приведи пример из реальной практики: sort.Slice, горутины или HTTP-обработчики.

Если спросят про захват переменных в цикле - упомяни, что до Go 1.22 была проблема с переиспользованием переменной цикла, а после - поведение изменилось. Это покажет актуальность знаний.

Не углубляйся в теорию, если не просят. Достаточно 2-3 примеров и объяснения, зачем это нужно.

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

Интервьюер проверяет:

  • понимание синтаксиса и области применения анонимных функций;
  • знание замыканий и захвата переменных;
  • умение использовать анонимные функции в типовых сценариях (сортировка, горутины, defer);
  • осведомлённость о нюансах с переменными цикла в разных версиях Go.

Для junior-уровня достаточно уверенного объяснения с примерами. Если кандидат путается в замыканиях или не может привести пример использования - это сигнал о пробеле в базовых знаниях.

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

  • Путаница между анонимной функцией и обычной - непонимание, что имя не обязательно.
  • Ошибка с захватом переменных в цикле: ожидание, что каждая итерация создаёт свою копию (до Go 1.22 это не так).
  • Забывают, что анонимная функция - это значение, и её можно передавать, возвращать и хранить.
  • Пытаются объявить анонимную функцию на уровне пакета - так нельзя, только внутри функции.
  • Не используют параметры для горутин, полагаясь на замыкание, что приводит к гонкам данных.

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

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