Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Go

Let's Go: организация кода Golang

by
Read Time:7 minsLanguages:

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Го - особый язык среди современных языков. Он очень самоуверенный. Например, есть только одно верное форматирование. Go расскажет вам, как разместить ваш код и как разместить фигурные скобки. Но это гораздо глубже.

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

В этой статье я рассмотрю некоторые ограничения Go, обсужу их достоинства и предложу варианты для наиболее распространенных ситуаций.

Проект Эйлера

Когда я начал изучать Go, я создал решение для проблемы № 6 и просто поместил его в подкаталог вместе с решениями других проблем на других языках. Смотрите Проект Эйлера.

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

Зависимости

Каждая нетривиальная программа состоит из нескольких файлов или модулей или компонентов или классов. Я просто буду использовать «файл» в качестве общего термина. Они часто группируются в библиотеках, пакетах или сборках. Я просто буду использовать «пакет» в качестве общего термина. Код, который вы пишете, зависит от кода в других файлах и пакетах.

Вы должны сообщить своему коду, как найти эти пакеты и файлы, чтобы использовать их функциональность. У каждого языка есть свой термин: импортировать, включать, требовать. Я просто буду использовать «импорт» в качестве общего термина.

Некоторые языки (или специфичные для языка инструменты) также позволяют устанавливать зависимости из удаленного хранилища пакетов и устанавливать их в стандартное локальное расположение, из которого их можно импортировать.

В большинстве распространенных языков программирования у вас много свободы. В C/C ++ вы сообщаете компилятору/компоновщику, где находятся файлы и статические библиотеки (используя параметры командной строки или переменные среды, такие как INCLUDE_DIR). В Python вы можете устанавливать пакеты из PyPI с помощью setup.py или с помощью pip из PyPI и репозиториев удаленного контроля версий. Затем вы импортируете на основе пути поиска пакета sys.path.

Путь Go

Go, как всегда, более предписывающий. Это может оскорбить вашу креативность, если вы не будете так много говорить о том, где размещать вещи, но в конце концов это не имеет большого значения, и у вас достаточно гибкости, чтобы приспособиться к различным ситуациям.

Go требует, чтобы вы поместили свой код в рабочую область. Рабочая область - это просто каталог с тремя подкаталогами: src, pkg и bin. Рекомендуется хранить все свои проекты в одном рабочем пространстве. Таким образом, они могут зависеть друг от друга и совместно использовать общие сторонние пакеты.

Примечание. В настоящее время я работаю в Windows и использую PowerShell для многих интерактивных примеров. В следующем разделе я хотел показать структуру каталогов моего рабочего пространства с помощью команды tree. У Windows есть своя собственная команда tree.exe, но она очень ограничена (без уровней). Якобы здесь есть полноценная древовидная команда для Windows.

Но сайт был недоступен. Я закончил тем, что запустил Docker-контейнер с Ubuntu, смонтировал свое рабочее пространство Go как /docs/Go и использовал команду дерева Linux для его отображения. Так что не смущайтесь, если вы видите среду Linux, в которой отображаются каталоги и файлы Windows с суффиксами .exe.

Вот мое текущее рабочее пространство Go. Каталог bin содержит различные команды/инструменты Go и отладчик delve. В каталоге pkg есть подкаталог с платформой (Win 64), который содержит пакеты, упорядоченные по происхождению (github.com, golang.com и т.д.). Каталог src имеет аналогичные подкаталоги для исходного хранилища или веб-сайта (github.com, golang.org и т.д.).

Давайте посмотрим на один из исходных проектов, которые я создал в src: go-web-crawler. Здесь все довольно просто: просто список файлов Go, лицензия и файл README.

GOROOT и GOPATH

Две переменные окружения контролируют вашу судьбу в стране Го. GOROOT - это место установки Go:

Обратите внимание, что корневой каталог Go выглядит как расширенный набор рабочей области с каталогами src, bin и pkg.

GOPATH указывает на ваше рабочее пространство. Вот как Go находит ваш код.

Существует множество других переменных среды, связанных с Go, многие из которых вы должны были установить в прошлом (например, GOOS и GOARCH). Теперь они являются необязательными, и вы не должны связываться с ними, если вам это действительно не нужно (например, при кросс-компиляции). Чтобы увидеть все переменные среды Go, введите: go env.

Установка и импорт

Когда вы создаете программу Go или библиотеку, вы можете установить ее. Программы попадают в каталог bin вашего рабочего пространства, а библиотеки - в каталог pkg рабочего пространства. В Windows я обнаружил, что ваш %GOPATH%/bin отсутствует в каталоге %PATH%, поэтому Windows не может найти мой исполняемый файл. Я добавил его в Windows PATH и все заработало. Вот как проверить в PowerShell, что ваш PATH содержит каталог bin рабочей области:

Давайте посмотрим все это в действии.

Если я захожу в каталог go-web-crawler и набираю go install, то go-web-crawler.exe создается в c:\Users\the_g\Documents\Go\bin:

Теперь я могу запустить его из моего поискового робота Go из любого места.

Multi-Go среды

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

Существуют различные проекты с открытым исходным кодом для вендоринга, управления пакетами и виртуальных сред. По некоторым причинам большинство из них не поддерживают Windows. Я не уверен, почему такие инструменты должны быть специфичными для платформы. Я могу написать кроссплатформенный менеджер среды Go самостоятельно на днях.

Заключение

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.