Функции на Go в изолированных средах выполнения
Развёртывайте функции на Go 1.22 в изолированных контейнерах: экспортируйте точку входа Handler(event, context), как в AWS Lambda, объявляйте зависимости в go.mod, включая CGO-пакеты, и делите маршрутизацию шлюза с функциями на Node.js и Python в том же рабочем пространстве.
Обновлено: 2026-10-26
Почему Go в бессерверных функциях раньше был болью
- Edge-изоляты не поддерживают CGO и нативные системные библиотеки
- AWS Lambda для Go требует свой bootstrap-бинарник и нестандартную обвязку обработчика
- Смешать Go-функции с API на Node.js или Python означало отдельные платформы или хаки со слоями Lambda
Go идеален для высоконагруженных обработчиков, CLI-утилит, скомпилированных в функции, и тяжёлых вычислений, которым помогают статическая типизация и горутины. Но типичные платформы бессерверных функций держат Go на вторых ролях: требуют bootstrap-обёртки, исключают CGO или вовсе выталкивают с платформы.
Что теряется на edge и в Lambda для Go
Среды выполнения на edge работают в V8-изолятах: ни CGO, ни нативных модулей, ни системных пакетов. Биндинги SQLite, библиотеки обработки изображений и криптопакеты, зависящие от C, там просто недоступны.
Среда выполнения AWS Lambda для Go требует собрать main-бинарник со своей сигнатурой обработчика и bootstrap-прослойкой — это не та же карта события, что у Node.js и Python в том же API.
Lambda-совместимые Go-обработчики в изолированных контейнерах
Go-функции Inquir экспортируют Handler(event, context) — тот же контракт с картой события, что у Node.js и Python на платформе. Читайте HTTP-поля шлюза из event["body"], event["headers"] и event["queryStringParameters"]; возвращайте map или объект в стиле API Gateway. CGO-пакеты собираются при деплое, потому что функции работают в полноценных Docker-контейнерах.
Go-функции делят API-шлюз с функциями на Node.js и Python в том же рабочем пространстве. Одна таблица маршрутов, одна модель секретов, один стек наблюдаемости — независимо от языка.
Возможности функций на Go
Lambda-совместимый контракт обработчика
Экспортируйте Handler(event map, context map) (или obs.Context). Свой bootstrap-бинарник и обёртка net/http-сервера не нужны.
Вся экосистема Go-модулей
go.mod и go.sum поддерживаются. Пакеты с CGO вроде mattn/go-sqlite3 собираются при деплое в контейнерной сборке.
Конкурентность на горутинах
Горутины работают как положено: разветвляйте параллельные запросы, используйте каналы и родные примитивы конкурентности Go.
Мультиязычное рабочее пространство
Go-функции делят маршруты шлюза, секреты и наблюдаемость с функциями на Node.js и Python в том же рабочем пространстве.
Как развернуть функции на Go в Inquir
Написать точку входа Handler
Экспортируйте func Handler(event map[string]interface{}, ctx map[string]interface{}) (interface{}, error). Для JSON-POST со шлюза разбирайте строку event["body"].
Описать go.mod
Стандартный файл Go-модуля. Перечислите зависимости, при необходимости — включая CGO-пакеты.
Развернуть и подключить маршрут
Inquir компилирует плагин, деплоит функцию и добавляет её в маршрутизацию шлюза рядом с функциями на других языках.
Функция на Go: обработчик JSON API
Lambda-совместимый паттерн. Разбирайте event["body"], когда шлюз присылает JSON-строку; для HTTP-маршрутов возвращайте statusCode + body. CGO-зависимости из go.mod собираются при деплое.
package main import ( "encoding/json" ) func parsePayload(event map[string]interface{}) map[string]interface{} { if s, ok := event["body"].(string); ok && s != "" { var out map[string]interface{} if err := json.Unmarshal([]byte(s), &out); err != nil || out == nil { return map[string]interface{}{} } return out } return event } func Handler(event map[string]interface{}, ctx map[string]interface{}) (interface{}, error) { payload := parsePayload(event) name, _ := payload["name"].(string) if name == "" { name = "World" } body, _ := json.Marshal(map[string]string{"message": "Hello, " + name}) return map[string]interface{}{ "statusCode": 200, "headers": map[string]interface{}{"Content-Type": "application/json"}, "body": string(body), }, nil }
Когда выбирать функции на Go
Когда это уместно
- Высоконагруженные JSON-обработчики, где важна экономная работа Go с памятью
- Функции, зависящие от CGO-пакетов (SQLite, обработка изображений, криптография)
- Команды, которые уже пишут сервисы на Go и хотят один язык по всему стеку
Когда лучше выбрать другое
- Тяжёлый ML и обработка данных — для этого лучше подходит Python с numpy/pandas
Частые вопросы
Работает ли CGO в Go-функциях Inquir?
Да. Функции работают в полноценных Docker-контейнерах с настоящим окружением сборки Linux — CGO-пакеты из go.mod собираются при деплое, в отличие от сред выполнения на edge.
Это net/http или стиль Lambda?
Стиль Lambda: экспортируйте Handler(event, context) и читайте поля шлюза из карты события. Сервер на http.ListenAndServe писать не нужно — платформа вызывает Handler на каждый запрос.
Как холодный старт соотносится с Node.js?
Go-бинарники обычно стартуют быстрее Node.js на той же нагрузке. Для постоянного трафика используйте тёплые контейнеры независимо от языка — ради стабильной задержки p95.