Как JetBrains отучает нейросети писать на Go образца 2015 года

28 авг 2026
2,049
63
18
3 недели

Если вы просили 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, чтобы сразу увидеть разницу в первых же сгенерированных функциях.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.