Го — особый язык среди современных языков. Это очень самоуверенно. Например, есть одно верное форматирование. Go расскажет вам, как разместить код и где поставить фигурные скобки. Но это гораздо глубже, чем это.
Go также расскажет вам, как извлечь выгоду из ваших функций и переменных, чтобы сделать их открытыми или закрытыми. Это будет диктовать структуру каталогов вашего кода. Это может стать неожиданностью для разработчиков, пришедших на Go из более либеральных языков программирования.
В этой статье я рассмотрю некоторые ограничения Go, расскажу о их достоинствах и предложу варианты для наиболее распространенных ситуаций.
Go — невероятно мощный язык программирования, изучите все от написания простых утилит до создания масштабируемых, гибких веб-серверов в нашем полном курсе.
Проект Эйлера
Когда я начал изучать Go, я создал решение для проблемы № 6 и просто поместил его в подкаталог вместе с решениями других проблем на других языках. Смотрите проект Эйлера .
Проблема в том, что Go не хочет, чтобы вы просто разбрасывали файлы Go случайным образом повсюду. Позже я понял, что, хотя это работает в очень простых случаях, когда вы не импортируете другие пакеты, это не правильно.
зависимости
Каждая нетривиальная программа состоит из нескольких файлов или модулей или компонентов или классов. Я просто буду использовать «файл» в качестве общего термина. Они часто группируются в библиотеках, пакетах или сборках. Я просто буду использовать «пакет» в качестве общего термина. Код, который вы пишете, зависит от кода в других файлах и пакетах.
Вы должны сообщить своему коду, как найти эти пакеты и файлы, чтобы использовать их функциональность. У каждого языка есть свой термин: импортировать, включать, требовать. Я просто буду использовать «импорт» в качестве общего термина.
Некоторые языки (или специфичные для языка инструменты) также позволяют устанавливать зависимости из удаленного хранилища пакетов и устанавливать их в стандартное локальное расположение, из которого можно импортировать.
В большинстве распространенных языков программирования у вас много свободы. В C / C ++ вы сообщаете компилятору / компоновщику, где находятся файлы и статические библиотеки (используя параметры командной строки или переменные среды, такие как INCLUDE_DIR). В Python вы можете устанавливать пакеты из PyPI, используя setup.py или pip из PyPI и репозитории удаленного управления исходным кодом. Затем вы импортируете на основе пути поиска пакета sys.path.
Путь Путь
Иди, как всегда, более предписывающий. Это может оскорбить вашу креативность, если вы не скажете так много о том, где разместить вещи, но в конце концов это не имеет большого значения, и у вас достаточно гибкости, чтобы приспособиться к различным ситуациям.
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 и т. Д.).
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
root@67bd4824f9d5:/docs/Go# tree -n -L 3
|— bin
|
|
|
|
|
|
|
|
|
|
|
|— pkg
|
|
|
|
|
`— src
|— github.com
|
|
|
|
|
|
|
|
|
|
|
|
|— golang.org
|
|— gopkg.in
|
`— sourcegraph.com
`— sqs
27 directories, 11 files
|
Давайте посмотрим на один из исходных проектов, которые я создал в src
: go-web-crawler. Здесь все довольно просто: просто список файлов Go, лицензия и файл README.
1
2
3
4
5
6
7
8
9
|
root@67bd4824f9d5:/docs/Go# tree src/github.com/go-web-crawler/ -n
src/github.com/go-web-crawler/
|— LICENSE
|— README.md
|— channel_crawl.go
|— main.go
`— sync_map_crawl.go
0 directories, 5 files
|
ГОРУТ и ГОПАТ
Две переменные среды управляют вашей судьбой в стране Го. GOROOT
— это место установки Go:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
09:21:26 C:\Users\the_g\Documents\Go> ls Env:\GOROOT
Name Value
—- ——
GOROOT C:\Go\
09:21:35 C:\Users\the_g\Documents\Go> ls c:\go
Directory: C:\go
Mode LastWriteTime Length Name
—- ————- —— —-
d—— 8/16/2016 10:38 AM api
d—— 8/16/2016 10:38 AM bin
d—— 8/16/2016 10:38 AM blog
d—— 8/16/2016 10:38 AM doc
d—— 8/16/2016 10:38 AM lib
d—— 8/16/2016 10:38 AM misc
d—— 8/16/2016 10:38 AM pkg
d—— 8/16/2016 10:38 AM src
d—— 8/16/2016 10:38 AM test
-a—- 8/16/2016 1:48 PM 29041 AUTHORS
-a—- 8/16/2016 1:48 PM 1168 CONTRIBUT
-a—- 8/16/2016 1:48 PM 40192 CONTRIBUT
-a—- 8/16/2016 1:48 PM 1150 favicon.i
-a—- 8/16/2016 1:48 PM 1479 LICENSE
-a—- 8/16/2016 1:48 PM 1303 PATENTS
-a—- 8/16/2016 1:48 PM 1638 README.md
-a—- 8/16/2016 1:48 PM 26 robots.tx
-a—- 8/16/2016 1:48 PM 5 VERSION
|
Обратите внимание, что корневой каталог Go выглядит как расширенный набор рабочей области с каталогами src, bin и pkg.
GOPATH
указывает на ваше рабочее пространство. Вот как Go находит ваш код.
1
2
3
4
5
|
09:21:53 C:\Users\the_g\Documents\Go> ls Env:\GOPATH
Name Value
—- ——
GOPATH c:\Users\the_g\Documents\Go
|
Существует множество других переменных среды, связанных с Go, многие из которых вы должны были установить в прошлом (например, GOOS
и GOARCH
). Теперь они являются необязательными, и вы не должны связываться с ними, если вам это действительно не нужно (например, при кросс-компиляции). Чтобы увидеть все переменные среды Go, введите: go env
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
09:51:10 C:\Users\the_g> go env
set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=c:\Users\the_g\Documents\Go
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
set CXX=g++
set CGO_ENABLED=1
|
Установка и импорт
Когда вы создаете программу Go или библиотеку, вы можете установить ее. Программы попадают в каталог bin
вашей рабочей области, а библиотеки — в каталог pkg
рабочей области. В Windows я обнаружил, что ваш %GOPATH%/bin
отсутствует в каталоге %PATH%
, поэтому Windows не может найти мой исполняемый файл. Я добавил его в Windows PATH, и все заработало. Вот как проверить в PowerShell, что ваш PATH содержит каталог bin рабочей области:
1
2
3
4
|
10:56:19 C:\Users\the_g> $env:path.split(«;») |
C:\Go\bin
c:\Users\the_g\Documents\Go\bin
|
Давайте посмотрим все это в действии.
Если я захожу в каталог go-web-crawler и набираю go install
то go-web-crawler.exe создается в c:\Users\the_g\Documents\Go\bin
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
11:09:18 C:\Users\the_g> ls $env:GOPATH/bin
Directory: C:\Users\the_g\Documents\Go\bin
Mode LastWriteTime Length Name
—- ————- —— —-
-a—- 8/15/2016 11:05 AM 15891456 dlv.exe
-a—- 8/15/2016 10:08 AM 3972608 go-outline.exe
-a—- 8/15/2016 10:10 AM 4502528 go-symbols.exe
-a—- 9/18/2016 10:14 AM 1849856 go-web-crawler.exe
-a—- 8/15/2016 10:08 AM 12097024 gocode.exe
-a—- 8/15/2016 10:17 AM 6642688 godef.exe
-a—- 8/15/2016 9:32 AM 6625792 golint.exe
-a—- 8/15/2016 10:14 AM 6352896 gometalinter.exe
-a—- 8/15/2016 10:10 AM 2738688 gopkgs.exe
-a—- 8/15/2016 10:10 AM 6961152 gorename.exe
-a—- 8/15/2016 10:09 AM 7291904 goreturns.exe
-a—- 8/15/2016 10:11 AM 9722368 guru.exe
|
Теперь я могу запустить его из моего поискового робота Go из любого места.
1
2
3
4
5
6
7
8
9
|
11:10:32 C:\Users\the_g> go-web-crawler.exe
found: http://golang.org/ «The Go Programming Language»
found: http://golang.org/cmd/ «»
not found: http://golang.org/cmd/
found: http://golang.org/pkg/ «Packages»
found: http://golang.org/pkg/os/ «Package os»
found: http://golang.org/pkg/fmt/ «Package fmt»
found: http://golang.org/ «The Go Programming Language»
|
Multi-Go среды
Это все хорошо, но иногда жизнь не так проста. Вы можете хотеть иметь несколько отдельных рабочих пространств. Более того, вы можете захотеть иметь несколько установок Go (например, разные версии) и несколько рабочих областей для каждой. Вы можете сделать это, динамически устанавливая GOPATH
для изменения рабочей области и устанавливая GOROOT
для изменения активной установки Go.
Существуют различные проекты с открытым исходным кодом для вендинга, управления пакетами и виртуальных сред. По некоторым причинам большинство из них не поддерживает Windows. Я не уверен, почему такие инструменты должны быть специфичными для платформы. Я могу написать кроссплатформенный менеджер среды Go самостоятельно на днях.
Вывод
Go — это устранение случайных сложностей. Иногда это звучит как очень строгое и предписывающее. Но если вы погрузитесь в мышление дизайнеров Go, вы начнете понимать, что избегание, запрещение или обязательство определенных вещей действительно делает все проще.