# 1.2 $GOPATH и рабочий каталог ## $GOPATH Все команды Go зависят от переменной окружения $GOPATH. Имейте в виду, что это не переменная $GOROOT, в которой хранится путь установки Go. Эта переменная указывает на рабочий каталог Go на Вашем компьютере (я использую этот путь у себя на компьютере; Вы можете заменить его по своему усмотрению, если структура каталогов на вашем компьютере другая). В Unix-подобных системах переменную можно задать следующим образом: export GOPATH=/home/apple/mygo В Windows Вам нужно создать новую переменную окружения GOPATH, а затем задать ей значение `c:\mygo`( ***Оно зависит от того, где расположен Ваш рабочий каталог*** ) $GOPATH при Вашем желании может содержать больше одного пути к рабочим каталогам, но помните, что следует использовать знак `:`(или `;` в Windows) для того, чтобы разделять их. В этом случае `go get` будет сохранять содержимое в первый путь из тех, что указаны в $GOPATH. В $GOPATH должно находиться три следующих папки: - `src` для текстов исходных кодов с расширениями .go, .c, .g, .s. - `pkg` для скомпилированных файлов с расширением .a. - `bin` для исполняемых файлов. В этой книге я буду использовать `mygo` в качестве единственного пути в $GOPATH. ## Каталог пакета Создайте каталоги и исходные файлы пакетов, такие как `$GOPATH/src/mymath/sqrt.go` (где `mymath` - имя пакета) ( ***Автор использует `mymath` в качестве имени пакета и в качестве имени каталога, где располагаются исходные файлы этого пакета***) Каждый раз при создании пакета Вы должны создать новый каталог в каталоге 'src'. Каталог обычно называется так же, как и пакет, который предполагается использовать. Можно использовать многоуровневую структуру каталогов, если нужно. Например, если создать каталог `$GOPATH/src/github.com/astaxie/beedb`, то путь к пакету будет `github.com/astaxie/beedb`. Имя пакета - это имя последнего каталога пути, в данном случае `beedb`. Выполните следующие команды: ( ***Сейчас автор возвращается к примеру*** ) cd $GOPATH/src mkdir mymath Создайте новый файл `sqrt.go` и поместите туда следующее: ```Go // Исходный код $GOPATH/src/mymath/sqrt.go package mymath func Sqrt(x float64) float64 { z := 0.0 for i := 0; i < 1000; i++ { z -= (z*z - x) / (2 * x) } return z } ``` Сейчас нами создан каталог пакета, в пакете содержится код. Я рекомендую использовать одни и те же названия для пакетов и каталогов, в которых они находятся; таким образом, каталог будет содержать все исходные файлы пакета. ## Компиляция пакетов Мы только что создали пакет, но как нам теперь скомпилировать его для того, чтобы потом использовать? Для этого существуют два способа: 1. Перейдите в каталог пакета и выполните команду `go install`. 2. Выполните вышеуказанную команду с указанием имени файла, например `go install mymath`. После компиляции можно открыть каталог: cd $GOPATH/pkg/${GOOS}_${GOARCH} // Вы увидите созданный файл mymath.a Файл с расширением `.a` - это исполняемый файл нашего пакета. Как его можно использовать? Очевидно, что для этого нам нужно создать какое-нибудь приложение. Создайте новое приложение под названием `mathapp`. cd $GOPATH/src mkdir mathapp cd mathapp vim main.go Код: ```Go //$GOPATH/src/mathapp/main.go source code. package main import ( "mymath" "fmt" ) func main() { fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2)) } ``` Для того, чтобы скомпилировать это приложение, перейдите в каталог с приложением `$GOPATH/src/mathapp`, затем выполните команду `go install`. Вы должны увидеть, как исполняемый файл `mathapp` появился в каталоге `$GOPATH/bin/`. Для запуска приложения выполните команду `./mathapp`. Вы должны увидеть следующее в терминале: Hello world. Sqrt(2) = 1.414213562373095 ## Установка удаленных пакетов В Go есть инструмент для установки удаленных пакетов - команда `go get`. Он поддерживает работу с большинством сообществ Open Source, включая GitHub, Google Code, BitBucket и Launchpad. go get github.com/astaxie/beedb Чтобы обновить Ваши удаленные пакеты, выполните `go get -u …`, при этом установятся все дополнительные зависимости . Для разных Open Source платформ потребуются различные системы контроля версий, например `git` для GitHub и `hg` для Google Code. Поэтому Вам нужно установить соответствующие системы контроля версий перед использованием `go get`. После выполнения команд выше структура каталогов будет выглядеть следующим образом: $GOPATH src |-github.com |-astaxie |-beedb pkg |--${GOOS}_${GOARCH} |-github.com |-astaxie |-beedb.a Фактически `go get` делает точную копию кода в $GOPATH/src локальной файловой системы, а затем выполняет `go install`. Удаленные пакеты можно использовать так же, как и локальные: import "github.com/astaxie/beedb" ## Полная структура каталогов Если Вы выполнили все предыдущие шаги, структура каталогов должна выглядеть следующим образом: bin/ mathapp pkg/ ${GOOS}_${GOARCH}, например darwin_amd64, linux_amd64 mymath.a github.com/ astaxie/ beedb.a src/ mathapp main.go mymath/ sqrt.go github.com/ astaxie/ beedb/ beedb.go util.go Можно ясно видеть структуру каталогов: `bin` содержит исполняемые файлы, `pkg` - скомпилированные файлы и `src` - исходные коды пакетов. (В Windows переменная окружения называется `%GOPATH%`, однако эта книга следует в основном стилю Unix. Если Вы пользуетесь Windows, замените везде ее название сами.) ## Ссылки - [Содержание](preface.md) - Предыдущий раздел: [Установка](01.1.md) - Следующий раздел: [Утилиты Go](01.3.md)