D:\sideБлогВсё, го, go, погнали!

⚠️ Обращайте внимание на даты.
Этот блог больше не ведётся с 17 января 2023, и на тот момент с написания этой страницы (14.04.2016) прошло 6 лет.

На работе поднялся вопрос о том, как собрать адекватную среду разработки на языке Go (или Golang), активно развиваемом Google. Посему, этот пост предназначается больше моим коллегам. Мне уже приходилось писать на Go небольшую (<100 строк, но при этом полезную) программку для рабочих нужд, поэтому как собрать приличную среду разработки, я уже представлял. Единственное, чего не хватало, это отладчика. Но без него я обходился настолько долго, что написанная программка стала не нужна (хи-хи) и дальнейшая деятельность в этом направлении была свёрнута. В качестве основы для среды будет использован Atom.

Условия эксперимента

Чтобы было совсем честно, я сделал чистую виртуальную машину в VirtualBox. 2 Гб оперативной памяти, 20 Гб жёсткого диска, наверняка с запасом.

Установил я туда Xubuntu 15.10, Wily Werewolf на русском. Примерно то же самое я проделал ранее на LMDE2 (Linux Mint Debian Edition), а значит это наверняка сработает на Debian 8 (Jessie) и производных Debian, в т. ч. Ubuntu.

После установки я обновился. По привычке. В данном случае это могло быть необязательно и только сделало процедуру дольше.

Большая часть команд будет вводиться в эмулятор терминала, вызываемый по Ctrl+Alt+T.

Поехали!

Итак, загрузились в свежеустановленный Xubuntu. Идём в Firefox, на сайт Atom и скачиваем оттуда установщик. Просто скачиваем, просто устанавливаем, всё как обычно. Никаких приключений.

Затем в терминале устанавливаем Git… стоп, он уже установлен. Окей, двигаем дальше.

Теперь ставить сам Go.

Зная необходимость для разработчика иметь в одной системе несколько версий компилятора для комфортной проверки совместимости, стоит сразу задуматься о менеджере версий. Такие инструменты есть для Ruby и NodeJS, и я подозревал, что для Go такое тоже есть. И да! Знакомьтесь, GVM.

Вообще в репозиториях Debian есть Go (пакет golang и вариация на GCC, gccgo), и очень может быть, что достаточно установить его и задать $GOPATH, но особых трудностей в этом нет, рассмотрим сценарий посложнее и погибче, размещённый целиком в домашней папке.

В Ubuntu/Debian нужно установить зависимости (секция Linux Requirements), затем установить GVM (секция Installing). Система попросит открыть новую терминальную сессию, чтобы GVM можно было начать использовать. Это потому, что GVM вмешивается в процесс включения оболочки, закидывая в PATH пути к исполняемым файлам Go выбранной в GVM версии.

Теперь занимательная историческая деталь. Ранние версии Go написаны на C++, компиляторы которого есть в любом уважающем себя дистрибутиве Linux. Но начиная с версии 1.5 компилятор Go написан на Go. Поэтому сходу собрать последнюю версию Go из исходников (что и делает GVM) не выйдет! Компилятор Go же нужно где-то взять. Предполагается, что он будет распространяться в уже скомпилированном виде. Если не покидать пределов GVM, то придётся устанавливать Go <1.5 (1.4.3 на момент написания), выбрать его, затем им установить Go 1.6.1 (последняя на данный момент), выбрать его, как Go по умолчанию и удалить <1.5 следующей… довольно понятной даже на вид последовательностью команд:

gvm install go1.4.3
gvm use go1.4.3
gvm install go1.6.1
gvm use go1.6.1 --default
gvm uninstall go1.4

Напоследок, установим Delve, отладчик. Должно хватить одной команды go get:

go get github.com/derekparker/delve/cmd/dlv

Если утилита молча поработала и завершилась, всё хорошо.

А что в Atom?

У Atom есть свой менеджер пакетов, apm, который можно дёргать, не открывая сам Atom. Этим и воспользуемся, установим в него пару нужных пакетов прямо из терминала:

apm install go-plus go-debug

В целом, всё. Можно пользоваться.

Пошли пробовать!

В среде Go принято держать “единое дерево пакетов”, и даже разработку собственных пакетов вести в нём же. Дерево располагается по пути в $GOPATH, эту переменную выставляет GVM. Сходим туда, сделаем там папку для нового пакета (возможно, вы захотите заменить username на свой логин на GitHub) и запустим в ней Atom:

cd $GOPATH
mkdir -p src/github.com/username/hello
cd src/github.com/username/hello
atom . # точка есть "текущая папка"

Обращаю внимание, что при работе с GVM (без доп. настройки) Atom необходимо запускать из терминала (на манер описанного выше), чтобы изменения в PATH подхватывались. Если запустить его из меню, он будет жаловаться, что не видит Go. Возможно, это чинится очень просто, но я рассматривал этот вопрос.

Atom встретит парой уведомлений в уголке о том, что он занимается доустановкой зависимостей. Процесс почти автоматизирован. В процессе и далее при первых использованиях инструментов для Go он будет предлагать кнопку Run Go Get, чтобы установить какой-нибудь недостающий пакет в Go.

Дождитесь, пока дела завершатся (позеленеют), позакрывайте вкладки “добро пожаловать!” (несколько нажатий Ctrl+W или мышью), и сделайте новый файл (Ctrl+N или мышью File->New File). В меню за Ctrl+Shift+L включите синтаксис Go.

Напишите в файле следующее:

package main

func main() {
  x := "Hello, world!"
  fmt.Println("")
}

Обращаю внимание, что эта программа не скомпилируется! Так сделано намеренно. После сохранения под именем hello.go (Ctrl+S) среда сама должна привести программу в порядок, добавив import – мы же хотим удостовериться, что всё работает. Но поскольку вы это делаете впервые, вам придётся установить соответствующие пакеты для Go. Atom сам это предложит в уведомлениях. Когда всё установится, сохраните файл ещё раз, чтобы файл обработался всем свежеустановленным.

Теперь к отладчику. Слева от номеров строк можно щёлкнуть, чтобы поставить точку останова. По какой-то причине для них не было отведено место и мне пришлось закрыть вкладку и открыть файл снова, чтобы место образовалось.

Поставьте точку останова на строчке с fmt.Println (у меня она стала седьмой), нажмите в отладчике Debug и на треугольную стрелочку вправо (“Continue”). В списках под кнопками сразу полезет информация о текущем состоянии программы.

Всё! Оставляю вас поиграться :)`

Развлекайтесь!

Обживайтесь в Атоме, для него существует гигантское количество пакетов, хотя далеко не для всех языков есть настолько проработанные, как для Go.

Пошарьтесь по настройкам, выставьте на свой вкус и цвет, установите себе тему оформления и синтаксиса, свой любимый шрифт, установите ещё какие-нибудь пакеты, интересных много. Необязательно через apm, можно просто из меню настроек (Ctrl+,).

Что касается Windows

Я провернул почти всё это на Windows 10 с установленным MSYS2. MSYS2 это очень мощная вещь, в которой есть pacman, менеджер пакетов, используемый в Arch Linux. Никогда им не пользовался, но свою задачу он выполняет и я им доволен. Изначально я его ставил ради Git, но оказалось, что там есть и другие весьма полезные вещи, скажем, zsh. Да, в Windows. Да, oh-my-zsh там работает. Нет, объявление Microsoft об интеграции Linux-подсистемы тут ни при чём, оно работало месяц назад на стабильном выпуске Windows 10 :).

Единственное, что пришлось подредактировать $PATH, чтобы в нём были:

После этого вы просто запускаете Atom откуда хотите (никаких фокусов с GVM) и всё просто работает. Восхитительно.

Хочется верить, что…

Сообщество Atom всё-таки сможет сделать общий интерфейс для отладчиков. У них получилось это сделать для линтеров (анализаторов) и автодополнения. Над отладчиками прогресса пока нет, но усилия прикладываются.