Статьи

Пойдем: организация кода Голанг

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

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

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

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

  • Go Lang
    Основные принципы построения веб-серверов
    Дерек Дженсен

Когда я начал изучать 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»

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

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

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