VSCode когда-то меня сильно порадовал, что это отличная IDE для Go практически сразу из коробки. Установил VSCode, установил одно расширение для Go, разрешил ему установить все нужные CLI зависимости, и готово. Без возни, и сразу все нужные фичи. Но с того момента всё сильно поменялось, и ручки всё-таки придётся подкрутить.

  • Выключаем “Use Language Server”. Он пока сырой, медленный, часто не может найти нужные пакеты. В общем, всё плохо. Единственное его преимущество в том, что он может делать свою магию прям в процессе набора кода, а не только при сохранении файла. В общем, всё будет круто, но ещё не скоро.

  • Включаем “Autocomplete Unimported Packages”, чтобы он умел подсказывать объекты, сигнатуры и всё такое до того, как пакет импортировали. Довольно удобно.

  • Включаем “Cover On Save” и “Cover On Single Test”. Coverage очень круто и красиво. Я когда первый раз изучал Go через TDD, мне это прям сильно понравилось, самое яркое впечатление.

  • В качестве “Format Tool” выбираем “goreturns”. Он, как несложно догадаться, умеет дополнять возвращаемые значения в функциях: подставить nil, пустую строку, всё такое. Красота.

  • Примечательно, что “Format Tool” селектор, а не чекбокс, и выбрать можно только один форматтер, а нам ещё нужен “goimports”, чтобы импорты дополнять. К счастью, у “goreturns” есть флаг, чтобы он после себя вызывал “goimports” (ох, вся эта экосистема состоит из костылей). Для этого в “Format Flags” добавляем “-i”.

  • В качестве “Lint Tool” выбираем golangci-lint и радуемся многообразию проверок, помогающих писать хороший код.

Вот конфиг, который можно подставить в settings.json, и всё сразу будет:

   "go.useLanguageServer": false,
    "go.autocompleteUnimportedPackages": true,
    "go.coverOnSave": true,
    "go.coverOnSingleTest": true,
    "go.formatTool": "goreturns",
    "go.formatFlags": [
        "-i"
    ],
    "go.lintTool": "golangci-lint",
}```

А ещё я решил попробовать [go-parsefix](https://github.com/quasilyte/go-parsefix) — автоматическую фиксилку синтаксиса. Ну там двоеточие в switch поставить, пропущенные запятые, всё такое. Штука сырая и багованная, но иногда работает. Интегрировать её можно через [Run on Save (MEDIUS)](https://marketplace.visualstudio.com/items?itemName=medius.runonsave) плагин. Ставьте именно этот, остальные глючат. Вот конфиг для него:

```{
    "medius.runonsave": {
        "commands": [
            {
                "match": ".*\\.go",
                "cmd": "parsefix -inplace -f=${file}"
            }
        ]
    }
}```

Удачи :)