Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

29.03.2024

Golang у VSCode: точимо сокиру

🪓 Історія перша. Автори asdf-golang придумали друкувати попередження, якщо в тебе не встановлена змінна оточення (типу, щоб попередити про її наявність.) Все б було чудово, але інтеграція Go у VSCode почала лаятися тим попередження просто без кінця.

Звісно, в оболонці в мене та змінна встановлена. Але то не допомагало. Чому? Бо VSCode, як графічний застосунок, не отримує оточення оболонки. Бо графічні застосунки в macOS запускає процес launchd, а не термінал — на відміну від Linux, де весь графічний інтерфейс запускається з термінала. Раніше мене це цілком влаштовувало, але цього разу знайшов, як додати змінну оточення до launchd:

launchctl setenv ASDF_GOLANG_MOD_VERSION_ENABLED true

Простішою альтернативою було б зробити скрипт-обгортку, яка б встановлювала потрібну змінну.

Історія друга. В мене чомусь давно golangci-lint у VSCode скаржився на відсутність типів з того самого модуля. Кумедно, коли тип підкреслений червоним, але є доступним для навігації — бо навігацію робить інша підсистема, а саме gopls. Ну й звісно помилка golangci-lint була хибною принаймні тому, що код компілювався та працював без жодних проблем.

Виявилося, що в лінтера golangci-lint є три режими перевірки під час збереження: перевірка файлу, модуля, або всього проєкту. Та якщо перевіряти один файл, то типів лінтер не бачить (хоча навіщо взагалі тоді робити цю перевірку — не знаю). Режим перевірки модуля все виправив.

Нарешті, бонус: помітив, що у кодування у JSON є дві приховані особливості. json.Marshal автоматично замінить символи HTML на еквівалентні послідовності (& на \u0026, наприклад.) Це щоб уникнути інʼєкцій — причому цю заміну неможливо вимкнути. А json.Encoder.Encode автоматично додає після обʼєкту символ нового рядка - тобто фактично прямо генерує формат jsonlines.