# 1.3 Утилиты Go ## Утилиты Go Язык Go имеет в своем распоряжении полный набор утилит, выполняемых из командной строки. Вы можете исполнить в терминале команду `go`, чтобы увидеть их: ![](images/1.3.go.png?raw=true) Рисунок 1.3 Команда Go показывает подробную информацию Все эти утилиты могут быть нам полезными. Давайте посмотрим, как пользоваться некоторыми из них. ## go build Эта утилита компилирует тесты. По необходимости она также скомпилирует зависимости. - Если имя пакета не `main`, а, например, `mymath` из раздела 1.2, то после того, как Вы выполните `go build`, ничего не скомпилируется. Если Вы хотите скомпилировать файл `.a` в `$GOPATH/pkg`, Вам вместо этого нужно выполнить `go install`. - Если имя пакета - `main`, то в каталоге, откуда Вы запустили утилиту, будет создан исполняемый файл. Если Вы хотите, чтобы файл был создан в `$GOPATH/bin`, используйте `go install` или `go build -o ${указать путь}/a.exe.` - Если в каталоге много файлов, но Вы хотите скомпилировать только один, Вам нужно добавить имя файла после `go build`. Например, `go build a.go`. Просто `go build` скомпилирует все файлы в каталоге. - Вы также можете указать имя исполняемого файла, который будет создан. Например, в проекте `mathapp` (раздел 1.2), команда `go build -o astaxie.exe` создаст `astaxie.exe` вместо `mathapp.exe`. Именем по умолчанию для исполняемого файла является имя каталога (если пакет не main) или название первого файла-исходника (если пакет - main). (Согласно [Спецификации Языка Программирования Go](https://golang.org/ref/spec) имя пакета должно следовать после слова `package` в первой строке исходного файла. Оно не обязательно должно быть таким же, как имя каталога, и имя исполняемого файла по умолчанию будет таким же, как и имя каталога.) - `go build` не работает с файлами, имя которых начинается на `_` или `.`. - Если Вам нужно несколько исходных файлов для каждой операционной системы, Вы можете в конце каждого имени файла добавить соответствующий суффикс ОС. Предположим, имеется несколько файлов для загрузки массивов. Можно назвать их следующим образом: array_linux.go | array_darwin.go | array_windows.go | array_freebsd.go `go build` выберет тот, который соответствует Вашей ОС. Например, в Linux-системах он скомпилирует только array_linux.go, а все остальные файлы, начинающиеся с array_, проигнорирует. ## go clean Эта команда удаляет все файлы, созданные компилятором, включая следующие: _obj/ // старый каталог object, созданный Makefiles _test/ // старый каталог test, созданный Makefiles _testmain.go // старый каталог gotest, созданный Makefiles test.out // старый каталог test, созданный Makefiles build.out // старый каталог test, созданный Makefiles *.[568ao] // объектные файлы, созданные Makefiles DIR(.exe) // создано go build DIR.test(.exe) // создано go test -c MAINFILE(.exe) // создано go build MAINFILE.go Я обычно пользуюсь этой командой, чтобы почистить свой проект от файлов перед тем, как загрузить его на Github. Эти файлы полезны на этапе тестов, но не нужны для контроля версий. ## go fmt и gofmt Те из вас, которые работают с C/C++, должны знать, что люди часто дискутируют, какой стиль написания кода лучше: K&R-стиль или ANSI-стиль. Однако же в Go есть только один стиль написания кода. Например, левые скобки могут быть только в конце строк, а не на своих отдельных строках, иначе Вы получите ошибку компиляции! К счастью, Вам не нужно запоминать все эти правила. `go fmt` сделает всю работу за Вас. Просто выполните команду `go fmt <Имя файла>.go` в терминале. Я не пользуюсь этой командой часто, поскольку среды разработки делают то же самое автоматически при сохранении проекта. О средах разработки я расскажу подробнее в следующем разделе. `go fmt` - это алиас(сокращение) для `gofmt -l -w` для пакетов, указанных в пути команды import. Мы обычно используем `gofmt -w` вместо `go fmt`. Последний вариант не переписывает исходники после форматирования кода. `gofmt -w src` форматирует весь проект. ## go get Эта команда служит для установки удаленных пакетов. На данный момент она поддерживает BitBucket, GitHub, Google Code и Launchpad. При запуске этой команды происходят следующие вещи: первая - Go скачивает исходники пакетов, вторая - исполняется `go install`. Перед использованием этой команды убедитесь, что у Вас установлены соответствующие инструменты: BitBucket (Mercurial Git) GitHub (git) Google Code (Git, Mercurial, Subversion) Launchpad (Bazaar) Для того, чтобы использовать эту команду, Вы должны корректно установить эти инструменты. Не забудьте установить переменную `$PATH`. Кстати, эта команда также поддерживает нестандартные доменные имена. Для более детальной информации используйте `go help remote` ( ***Прим. переводчика на русский язык - у меня сработала не эта команда, а `go help importpath`*** ). ## go install Эта команда компилирует все пакеты, создает соответствующие файлы и перемещает их в `$GOPATH/pkg` или `$GOPATH/bin`. ## go test Эта команда загружает все файлы, чьи имена включают в себя `*_test.go` и создает исполняемые файлы тестов, а затем печатает на экране информацию, подобную следующей: ok archive/tar 0.011s FAIL archive/zip 0.022s ok compress/gzip 0.033s ... По умолчанию она обрабатывает все файлы тестов. Для более подробной информации используйте `go help testflag`. ## godoc Многие говорят, что никакая сторонняя документация для программирования на Go не нужна (вообще, я одну сделал - [CHM](https://github.com/astaxie/godoc)). В Go существует мощная утилита для того, чтобы управлять документацией "из коробки". Итак, как мы можем ознакомиться с информацией о пакете в документации? Например, если Вы хотите получить подробную информацию о пакете `builtin`, используйте команду `godoc builtin`. Подобным образом Вы можете воспользоваться `godoc net/http` для того, чтобы ознакомиться с документацией по пакету `http`. Если Вам нужно больше деталей об отдельных функциях, выполните `godoc fmt Printf` и `godoc -src fmt Printf`, чтобы увидеть исходный код функции . Выполните `godoc -http=:8080`, затем откройте в браузере `127.0.0.1:8080`. Вы должны увидеть локальную версию сайта golang.org. Она покажет не только информацию о стандартных пакетах, но также о пакетах в Вашем `$GOPATH/pkg`. Это здорово для людей, которые страдают от Великого Китайского Файерволла. ## Другие утилиты В Go есть больше утилит, чем те, о которых мы только что говорили: go fix // делает апгрейд кода, написанного в версии, старее, чем go1 до новой версии (после go1) go version // выдает информацию об установленной версии Go go env // выдает информацию о переменных окружения Go go list // перечисляет все установленные пакеты go run // компилирует во временные файлы и запускает приложение По этим утилитам есть также более детальная информация. Вы можете воспользоваться `go help <утилита>`, чтобы ознакомиться с ней. ## Ссылки - [Содержание](preface.md) - Предыдущий раздел: [$GOPATH и рабочий каталог](01.2.md) - Следующий раздел: [Инструменты разработки для Go](01.4.md)