Как JetBrains отучает нейросети писать на Go образца 2015 года
Если вы просили Claude, ChatGPT или Cursor написать функцию на Go, то наверняка замечали странную вещь. Вы работаете на Go 1.23 или 1.24, а модель упрямо генерирует код десятилетней давности.
Там, где давно есть встроенные функции или пакет slices, нейросеть радостно выдает трехэтажный цикл с ручным перебором индекса. Вместо max(a, b) пишет ветвление с if-else. Вместо cmp.Or выстраивает длинную лестницу проверок на nil.
В JetBrains устали смотреть на такой код и выкатили открытый репозиторий go-modern-guidelines. Это набор правил и плагин для популярных ИИ-агентов, который заставляет их смотреть в go.mod и писать идиоматичный код под актуальную версию языка.
Почему ассистенты генерируют старый код
Проблема здесь не в том, что модели «глупые». Причин две, и обе упираются в специфику обучения нейросетей.
Первая причина связана со смещением частотности (frequency bias). В обучающей выборке любой LLM лежат терабайты кода, написанного с 2012 по 2022 год. Классический цикл for i := 0; i < n; i++ встречается на GitHub в сотни раз чаще, чем лаконичный for i := range n, появившийся в Go 1.22. Нейросеть выбирает статистически самый вероятный токен, поэтому вы раз за разом получаете код из эпохи Go 1.10.
Вторая причина заключается в отставании обучающих датасетов. Если фичу добавили в Go 1.24 или 1.26 (например, errors.AsType[T]), модель о ней просто не догадывается. Ей неоткуда было узнать о новых сигнатурах стандартной библиотеки.
Команда Go развивает встроенный анализатор modernize, который переписывает устаревшие конструкции в уже существующем проекте. Идея JetBrains логично продолжает эту мысль: зачем исправлять старый синтаксис линтерами после генерации, если можно сразу научить агента писать современно?
Что меняется в коде
Гайдлайны охватывают фичи стандартной библиотеки и языка с Go 1.0 вплоть до планируемых Go 1.26 и 1.27. Агент считывает версию компилятора из вашего go.mod и строго ограничивает используемый синтаксис этой планкой.
Вот несколько типичных примеров того, как меняется генерация:
Поиск элемента в срезе раньше выглядел как рукописный цикл:
// Так пишет обычная модель
found := false
for _, v := range items {
if v == target {
found = true
break
}
}
С подключенными инструкциями агент сразу берет готовый метод:
// Так пишет агент с правилами JetBrains
found := slices.Contains(items, target)
Выбор первого непустого значения или дефолтной настройки раньше требовал кучи проверок:
host := config.Host
if host == "" {
host = envHost
}
if host == "" {
host = "localhost"
}
Теперь агент использует cmp.Or:
host := cmp.Or(config.Host, envHost, "localhost")
Похожая история с поиском минимума и максимума. Вместо тернарных костылей через функции или условий if a > b агент берет встроенные min и max. В версиях Go 1.26 и новее инструмент подсказывает агенту конструкции вроде new(42) для быстрого создания указателя на литерал или типизированный разбор ошибок через дженерики errors.AsType[T](err).
Как это устроено под капотом
Архитектура проекта сделана просто и безопасно. В основе лежит небольшая CLI-утилита, написанная на Go.
Когда агент обращается к навыку, утилита скачивается через go install и сохраняется в локальный пользовательский кэш (например, в директорию ~/.cache/go-modern-guidelines). Проектные файлы плагин напрямую не модифицирует. Для запуска требуется Go 1.25 или более старая версия с включенным GOTOOLCHAIN=auto, чтобы тулчейн мог сам подтянуть нужный бинарник.
Интеграция работает со всеми основными агентами:
- Claude Code
- Cursor
- Junie от JetBrains
- Codex
- Любые другие агенты через CLI-раннер skills.sh (например, OpenCode)
Подключение к вашему редактору
Установка зависит от того, каким инструментом вы пользуетесь каждый день.
Для Claude Code достаточно добавить репозиторий и плагин через встроенную командную строку:
/plugin marketplace add JetBrains/go-modern-guidelines
/plugin install modern-go-guidelines@goland-claude-marketplace
После этого Claude Code начнет вызывать инструкцию автоматически во время работы с Go-файлами. При желании навык можно дернуть явно командой /modern-go-guidelines:use-modern-go.
Для Cursor репозиторий подключается через терминал:
cursor-agent plugin marketplace add https://github.com/JetBrains/go-modern-guidelines
Затем нужно открыть сессию Cursor и подтвердить установку плагина через меню /plugins.
Для Junie команды вводятся внутри сессии агента:
/extensions marketplace add JetBrains/go-modern-guidelines
/extensions install modern-go-guidelines
Если вы работаете с другими терминальными агентами, используйте пакетный менеджер навыков:
npx skills add JetBrains/go-modern-guidelines
Стоит ли ставить
Если вы пишете на Go в связке с нейросетями хотя бы пару часов в неделю, плагин определенно сэкономит время. Вам больше не придется на код-ревью одергивать модель и писать промпты в духе «перепиши через slices.Clone» или «используй range по числу».
Проект решает узкую, но раздражающую проблему. Репозиторий уже собрал больше двух тысяч звезд, что для простого набора инструкций к агентам — отличный показатель. Начать знакомство проще всего с установки плагина в Claude Code или Cursor, чтобы сразу увидеть разницу в первых же сгенерированных функциях.
