Стендап Сьогодні 📢 Канал в 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
.