Функции и multiple returns
Тема дорожной карты · Golang
Функции в Go — значения первого класса, объявляемые с помощью ключевого слова func; они являются основной единицей повторного использования кода и абстракции в языке. Функции Go поддерживают несколько возвращаемых значений — идиоматичная пара (result T, err error) лежит в основе явной модели обработки ошибок Go, — а также именованные возвращаемые значения и вариадические параметры (func sum(nums ...int) int). Анонимные функции (замыкания) захватывают переменные из своей области видимости, обеспечивая мощные паттерны: адаптеры http.HandlerFunc, компараторы sort.Slice и лямбды для запуска goroutines (go func() { ... }()). Методы на типах объявляются как функции с получателем (func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request)), а интерфейсы в Go удовлетворяются неявно любым типом, чей набор методов совпадает — дизайн, обеспечивающий слабую связность и высокую тестируемость Golang-кода. Оператор defer откладывает вызов функции до возврата из окружающей функции, делая функции в Go естественным местом для парного связывания получения и освобождения ресурсов (открытие/закрытие, блокировка/разблокировка, span.End()).
Как это работает
Функции и multiple returns намеренно мал: ключевые слова (var, const, if, for, switch, defer, go, select, return, type, func, package, import), нет классов (struct + методы + интерфейсы), нет исключений (multi-return + error-значения), нет наследования (композиция через embedding). Видимость по регистру: с заглавной — экспорт, со строчной — package-private. := объявляет + присваивает; = — присваивает. defer выполняется при возврате функции — идеально для cleanup. Компилятор не пропустит неиспользуемые импорты + переменные.
Когда применять
Примите минимализм — Go дерётся с попытками умничать. gofmt (без флагов, канонический стиль); коммитьте только отформатированный код. defer — для cleanup в паре с захватом (defer f.Close() сразу после f, err := os.Open(...)). Короткое объявление (:=) внутри функций; var — для zero-valued объявлений или когда нужен конкретный тип.
Типичные ошибки
Ловушки Функции и multiple returns: for i := range slice и получение и индекса и копии, когда хотели оба (for i, v := range slice); shadow внешних переменных через := ("почему внешняя переменная не изменилась?"); не обрабатывают ошибку немедленно (_, _ = ... игнорирует); глобальное состояние — Go-программы становятся сложными для понимания при shared mutable state.