Настройка окружения
Переходим к практике. Для начала настроим рабочую среду.
Установка компилятора
Установочные файлы под разные ОС, в том числе исходники с инструкцией по сборке, можно найти в разделе Downloads на
официальном сайте Go.
Toolchain
Вместе с компилятором поставляется набор программ и утилит, к которым можно получить доступ командой go. Их называют Go Toolchain.
Например, командой go env можно проверить установку Go, а заодно вывести список используемых инструментарием переменных окружения вместе с их значениями:
Команды go fmt и go test — тоже часть встроенного инструментария. Скомпилировать исходный код в исполняемый файл можно командой go build. Для локального запуска чаще используют команду go run — она совмещает в себе компиляцию и запуск программы.
Для вывода справки по работе с конкретной командой можно воспользоваться go help <command>.
Подробнее про Go Toolchain —
здесь.
GOPATH
Переменная окружения GOPATH указывает на директорию, в которой Go организует работу с пользовательским кодом, сторонними библиотеками, исполняемыми файлами и предкомпилированными компонентами, выступающими своего рода кешем для ускорения компиляции.
На практике рабочая директория Gо имеет следующую структуру:
По умолчанию в качестве GOPATH команда go использует директорию $HOME/go или %USERPROFILE%\go. Но рекомендуем задать рабочую директорию явным образом, прописав путь до неё в переменной окружения $GOPATH. Вы можете указать любую удобную для вас директорию.
До версии 1.11, в которой появились модули, все файлы исходного кода обязательно должны были находиться в $GOPATH/src. При использовании модулей исходный код Go-проектов может находиться в любой директории. Начиная с версии 1.16, модули включены по умолчанию. Используйте в ваших проектах модули — для этого достаточно вызвать go mod init в директории пакета.
Редакторы кода
Предлагаем установить IDE или подключить плагин к вашему любимому редактору:
Go Style
Теперь расскажем о стилизации кода, принятой в Go. Речь идёт не о форматировании — за него отвечает утилита fmt. Конвенции по оформлению касаются в большей степени языковых конструкций и именования создаваемых сущностей.
Как уже было сказано, в больших компаниях разработчики чаще читают код, чем пишут. В сообществе возникло предположение, что рабочий процесс можно оптимизировать, если все будут следовать единым подходам к реализации и оформлению кода. Это должно помочь быстрее вникать в незнакомый код и проводить код-ревью, так как не придётся повторять одни и те же комментарии к ошибкам.
Предположение породило сразу несколько популярных подходов:
Рекомендуем ознакомиться со всеми тремя, перед тем как делать практические задания курса.
Сейчас важно запомнить: в Go для именования переменных, констант, типов и функций используется camelCase. Именование в стиле snake_case используется только в генерированном коде. Это позволяет на глаз определить природу происхождения файла, так как в сгенерированный код крайне не рекомендуется вносить правки.
Playground
Go Playground — это браузерный редактор, который может пригодиться, когда нужно быстро проверить небольшие части кода или гипотезы относительно работы встроенных конструкций языка.
В Go Playground есть нюансы, о которых тоже важно помнить:
- время в нём некорректно, попытка получить текущее время системы всегда возвращает дату
2009-11-10 23:00:00; - random seed менять нельзя.
Можно найти альтернативы, например
Go Play Space, но в них не гарантируется корректная работа всех возможностей языка.
Структура проекта
Прежде чем начать писать код, неплохо бы разобраться, что представляет собой Go-проект на уровне структуры файлов и директорий.
У вашего проекта может быть такая иерархия:
Несмотря на то что Go — язык про стандарты и конвенции, строгих требований к структуре проектов на Go нет. Есть
рекомендации. Отчасти причина в том, что структура директорий и файлов зависит от размера и сложности реализуемой программой задачи. Любая стандартизация в этом случае может как помочь, так и помешать удобной работе с кодом.
Файлы
Исходный код программы на Go хранится в файлах с расширением .go в кодировке UTF-8. Код может быть разбит на произвольное количество файлов.
Пакеты
В Go для разграничения области видимости кода (scope) проект разделяют на пакеты (package). Каждый файл с кодом принадлежит определённому пакету. Имя пакета указывают после ключевого слова package в первой строке каждого файла, причём в одной директории не может быть файлов, принадлежащих разным пакетам.
Можно сказать, что пакет в Go — это директория. Рекомендуем указывать имя пакета, совпадающее с именем директории, где лежат файлы.
Код внутри пакета может обращаться к переменным, пользовательским типам, функциям, переменным и константам из соседних файлов без дополнительных действий — точно так же, как если бы они располагались в одном файле.
Особое место занимает пакет main, который вместе с функцией main() выступает входной точкой выполнения программы. Название директории, где лежат файлы пакета main, может быть произвольным. Наличие пакета main с функцией main() превращает набор пакетов в программу. Набор пакетов без входной точки может использоваться в качестве подключаемой библиотеки.
Импорт
Подключить пакет с кодом в Go можно ключевым словом import. Обращение к компонентам пакета — <package name>.<component name>.
Важно, чтобы название пакета совпадало с названием директории. Это позволяет узнать имя пакета, не заглядывая в его исходный код.
Часто вы будете импортировать в одном файле сразу несколько пакетов — лучше использовать блочную нотацию объявления импортов. Если у нескольких пакетов одинаковое название, нужно применить псевдонимы (aliases), которые вы можете давать пакетам:
Иногда нужно импортировать пакет для выполнения его кода инициализации, при этом никакие переменные и функции пакета не используются в явном виде. В этом случае компилятор Go откажется собирать программу, ссылаясь на неиспользуемый импорт.
Чтобы обойти это ограничение, вставим _ перед импортом — явно укажем компилятору на то, что ошибка со стороны программиста отсутствует и код этого пакета нужно добавить в программу:
Пакеты, импортированные в main, становятся частью программы и подхватываются компилятором при сборке. Циклические импорты в Go запрещены.
Перед импортом пакета можно поставить точку, тогда для обращения к объектам этого пакета не придётся указывать его имя: