Язык Go. Первые впечатления. Организация исходников

Язык Go. Первые впечатления. Организация исходников

Недавно я писал про книгу о языке Go (он же Golang), а теперь у меня появился первый боевой опыт использования этого языка. Хотя написанная программа и небольшая, но она позволила пощупать некоторые особенности языка. В этом посте хочу рассказать про одну особенность Go, непривычную по сравнению с другими языками — это особенности расположения исходников, поскольку в Go вы должны организовывать по определенной структуре в определенных папках.

Если кому интересно, то программа, которую я писал на Go (и продолжаю ее доводить до ума) предназначена для выковыривания из Википедии списка улиц Москвы с попыткой получить по ним информацию — округов и районов, где эти улицы проходят. Поскольку я периодически участвую в городских ориентированиях, то получение полного списка улиц, включая недавние переименования, для меня больной вопрос. Оказалось, что список улиц Москвы в Википедии достаточно оперативно обновляется, и там уже перечислены улицы, которых еще нет не то что в атласах (с атласами Москвы в последнее время вообще беда), но и на других официальных сайтах со списками улиц. К слову, на OpenStreetMap и Яндекс.Картах улицы тоже появляются достаточно оперативно, но там я не нашел способа получения списка улиц по округам и районам. Если кто подскажет, где можно найти полный такой список, буду благодарен.

Исходники программы streetlist лежат на github, там же есть и подробное описание программы с примерами ее использования.

Но вернемся к Go. Для тех, кто еще не слышал об этом языке, скажу, что это компилируемый язык со статической типизацией. Программы, написанные на языке Go являются полностью самостоятельными и не требуют от пользователя установки каких-то дополнительных библиотек, но при этом среда выполнения Go включает в себя сборщик мусора с подсчетом ссылок. В самом языке есть такое понятие как указатели, но они все обрабатываются сборщиком мусора, а арифметика с указателями не поддерживается. Язык является объектно-ориентированным, но объектная ориентация его несколько непривычная. Одной из особенностей языка являются так называемые горутины (gorutines) — что-то вроде легковесных потоков, которые можно делать в большом количестве, не опасаясь, что при этом просядет производительность, переносить их на реальные потоки будет среда выполнения Go.

В качестве рабочей среды я использую Vim с плагином vim-go, благодаря которому не только появляется раскраска синтаксиса Go, но он позволяет прозрачно работать с утилитами для проверки кода, его форматирования и некоторые другие.

Одно из заметных отличий Go от других языков заключается в том, что исходники программ могут располагаться не где вздумается, а в определенной папке. Эта папка (ли папки) задается вами, вы должны установить переменную окружения GOPATH до корневой папки, где будут расположены все исходники (и вашей программы, и сторонних пакетов). Например, переменная окружения GOPATH под Linux может иметь значение «/home/username/projects/go». Но и это еще не все, Go накладывает дальнейшие ограничения на структуру папок. Например, все исходники должны располагаться не просто по пути GOPATH, а в директории src, в которой должна быть заведена папка (не обязательно первого уровня вложенности) с вашим проектом. Т.е. в простейшем случае путь до программы hello.go может располагаться в папке «/home/username/projects/go/src/hello/».

После первой компиляции внутри GOPATH будут созданы еще две папки: «pkg» и «bin», т.е. в нашем случае — «/home/username/projects/go/pkg» и «/home/username/projects/go/bin». В первой папке будут располагаться скомпилированные версии разных пакетов, а в папку «bin» будут попадать скомпилированные версии программ после команды «go install». Про эту команду здесь ничего писать не буду, скажу только, что туда, например, будут складываться скомпилированные версии различных полезных утилит для Go, поэтому рекомендуется эту папку добавить в переменную окружения PATH.:

export GOPATH=’/home/username/projects/go’
export PATH=$PATH:$GOPATH/bin

Если вас не устроит такая жесткая привязка к одной папке, то вам придется «жонглировать» переменной окружения GOPATH, меняя ее с одной папки на другую. В принципе, в этом нет гичего страшного.

Такое ограничение в расположении исходников имеет свои плюсы. Один из плюсов заключается в том, что компилятор знает, где искать сторонние пакеты. В Go нет такого ужаса как #include из C/C++, и подключаются именно скомпилированные пакеты, а не исходные файлы. При этом, чтобы получить пакет достаточно где-то внутри GOPATH выполнить команду

go get путь_до_пакета

и пакет будет скачан в папку GOPATH/src/путь_до_пакета

И вот здесь проявляется еще одна интересность. Дело в том, что команда go get может получать исходники из разных источников, включая репозитории .git. Например, выполнив команду

go get github.com/PuerkitoBio/goquery

вы скачаете и установите библиотеку для парсинга HTML goquery, а скачается она в папку GOPATH/src/github.com/PuerkitoBio/goquery. Более того, в этом случае в вашей программе для использования этой библиотеки вы должны будете импортировать этот пакет, используя такой же путь:

import (
    "github.com/PuerkitoBio/goquery"
)

Аналогично, если вы захотите скачать исходники описанной выше программы streetlist для выковыривания списка улиц Москвы с Википедии, то вам достаточно будет набрать команду

go get github.com/jenyay/streetlist

и тогда Go скачает не только саму программу, но и все зависимости, включая вышеуказанную goquery и библиотеку cli для удобной работы с параметрами командной строки. И, разумеется, streetlist будет скачана в папку GOPATH/src/github.com/jenyay/streetlist.

В итоге на данный момент у меня папка GOPATH имеет такую структуру:

gopath

Некоторые пакеты появились в качестве зависимостей других пакетов (с моей стороны не пришлось делать никаких телодвижений, чтобы их скачать), кто-то появился в результате установки различных утилит для языка go.

Когда я читал книгу про Go, то такая привязка исходников мне казалась неудобной, но на практике это оказалось вполне неплохо.

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

PS. Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.

Пожалуйста, оцените запись

УжасноПлохоТак себеХорошоОтлично (Количество голосов: 3, средняя оценка: 5,00)
Загрузка...

Leave a comment

Subscribe without commenting