понедельник

Как писать код на языке программирования Go

Введение


Этот документ демонстрирует разработку простого пакета Go и представляет команды компилятора go. Это стандартный способ выбора, создания и установки пакетов и программ Go.

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

Подобное объяснение есть на видео.

Организация кода.


Рабочая область (Workspaces).


Go разрабатывался для работы с открытым исходным кодом, сохраняемым в общедоступных репозитариях. Хотя вы не обязаны публиковать свой исходный код, тем не менее среда для работы устанавливается тем же самым образом, не зависимо от того, публикуете вы свой код или нет.

Код Go должен сохраняться внутри рабочей области (workspaces). Рабочая область - это иерархический каталок с тремя каталогами в его корне:

- src содержит исходные файлы, систематизированные по пакетам (один пакет - один каталог).

- pkg содержит объекты пакетов.

- bin содержит исполняемые файлы.

Go собирает исходные пакеты и инсталлирует законченные исполняемые файлы в каталоги pkg и bin.

Подкаталог src обычно содержит множество репозитариев управления версиями (такие как Git и Mercurian), которые отслеживают разработку одного или более исходных пакетов.

Чтобы дать вам общее представление о том как на практике выглядит рабочая область, приводим пример:


bin/
    streak                         # command executable
    todo                           # command executable
pkg/
    linux_amd64/
        code.google.com/p/goauth2/
            oauth.a                # package object
        github.com/nf/todo/
            task.a                 # package object
src/
    code.google.com/p/goauth2/
        .hg/                       # mercurial repository metadata
        oauth/
            oauth.go               # package source
            oauth_test.go          # test source
    github.com/nf/
        streak/
            .git/                  # git repository metadata
            oauth.go               # command source
            streak.go              # command source
        todo/
            .git/                  # git repository metadata
            task/
                task.go            # package source
            todo.go                # command source

Эта рабочая область содержит три репозитария (goauth2, streak и todo), включая два
исполняемых файла (streak и todo) и две библиотеки (oauth и task).

Исполняемые файлы и библиотеки собираются из разных видов исходных пакетов. Мы обсудим это различие позднее.

Переменная среды GOPATH.


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

Чтобы начать, создайте каталог рабочей области и установите GOPATH. Ваша рабочая область может располагаться там где вы захотите, но мы в этом документе будем использовать $HOME/go. Обратите внимание, что это не должно быть тем же самым местом, куда вы установили Go.

$ mkdir $HOME/go
$ export GOPATH=$HOME/go

Для удобства добавьте из рабочей области подкаталог bin в PATH:

$ export PATH=$PATH:$GOPATH/bin

Путь к пакету.


Пакеты из стандартной библиотеки имеют короткий путь, например “fmt” и “net/http”. Ваши собственные пакеты должны иметь такой базовый путь, который вред ли будет конфликтовать с будущими добавлениями стандартных библиотек или другими внешними библиотеками.

Если вы сохраняете свой исходный код где-нибудь в репозитарии, то тогда вы должны использовать корень репозитария как свой базовый путь. Например, если у вас есть аккаунт GitHub github.com/user, то вы должны использовать его как базовый путь.

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

Мы, в качестве базового пути, будем использовать github.com/user. Создайте каталог внутри рабочей области, где будет храниться исходный код:

$ mkdir -p $GOPATH/src/github.com/user

Ваша первая программа.


Чтобы скомпилировать и запустить простую программу, сначала надо выбрать путь к пакету (мы используем github.com/user/hello) и создать соответствующий каталог внутри вашей рабочей области:

$ mkdir $GOPATH/src/github.com/user/hello

Далее, внутри этого каталога создайте файл с названием hello.go, который будет содержать следующий код Go.

package main

import "fmt"

func main() {
 fmt.Printf("Hello, world.\n")
}

Теперь вы можете собрать и инсталлировать программу с помощью инструмента go:

$ go install github.com/user/hello

Обратите внимание, что вы можете выполнить эту команду из любого места вашей системы. Go найдет исходный код, ища пакет github.com/user/hello внутри рабочей области, определенной GOPATH.

Также вы можете опустить путь к пакету, если запускаете go install из каталога пакета:

$ cd $GOPATH/src/github.com/user/hello
$ go install

Эта команда собирает hello, создавая исполняемый файл. Она инсталлирует исполняемый файл в каталог рабочей области bin как hello (или для Windows, hello.exe). В нашем примере это будет $GOPATH/bin/hello, который является $HOME/go/bin/hello.

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

Теперь вы можете запустить программу, введя её полный пусть в командную строку:

$ $GOPATH/bin/hello
Hello, world.
Или, так как вы добавили $GOPATH/bin в ваш PATH, то просто указав имя исполняемого файла:

$ hello
Hello, world.

Если вы используете систему управления исходным кодом, то теперь самое время для инициализации репозитария, добавления файлов и фиксации своих первых изменений. Снова, этот шаг является дополнением: вы не должны использовать управление исходным кодом, когда пишите код на Go.
$ cd $GOPATH/src/github.com/user/hello
$ git init
Initialized empty Git repository in /home/user/go/src/github.com/user/hello/.git/
$ git add hello.go
$ git commit -m "initial commit"
[master (root-commit) 0b4507d] initial commit
 1 file changed, 1 insertion(+)
  create mode 100644 hello.go

Ваша первая библиотека.


Давайте напишем библиотеку и используем её в программе hello.

И снова первым шагом является выбор пути пакета (мы будем использовать github.com/user/newmath) и создание его каталога:

$ mkdir $GOPATH/src/github.com/user/newmath

Затем создадим в этом каталоге файл с именем sqrt.go и следующим содержимым.

// Package newmath is a trivial example package.
package newmath

// Sqrt returns an approximation to the square root of x.
func Sqrt(x float64) float64 {
 z := 1.0
 for i := 0; i < 1000; i++ {
  z -= (z*z - x) / (2 * z)
 }
 return z
}

Теперь протестируем пакет, компилируя командой go build:

$ go build github.com/user/newmath

Или, если вы работаете в исходном каталоге пакета, то просто:

$ go build

Эта команда не создаст файл. Чтобы это сделать, вы должны использовать go install, который поместит объект пакета в каталог pkg вашей рабочей области.

После подтверждения, что пакет newmath был собран, измените первоначальный hello.go (который находиться в $GOPATH/src/github.com/user/hello) следующим образом:

package main

import (
 "fmt"

 "github.com/user/newmath"
)

func main() {
 fmt.Printf("Hello, world.  Sqrt(2) = %v\n", newmath.Sqrt(2))
}

Всякий раз, когда вы инсталлируете пакет или исполняемый файл, то это также устанавливает все имеющиеся зависимости. Итак, когда вы выполняете go install для программы hello

$ go install github.com/user/hello

то также автоматически будет установлен пакет newmath.

Запустив новую версию программы, вы должны увидеть вывод некоторых чисел:

$ hello
Hello, world.  Sqrt(2) = 1.414213562373095

После последнего действия, ваша рабочая область должна выглядеть следующем образом:

bin/
    hello              # command executable
pkg/
    linux_amd64/       # this will reflect your OS and architecture
        github.com/user/
            newmath.a  # package object
src/
    github.com/user/
        hello/
            hello.go   # command source
        newmath/
            sqrt.go    # package source

Обратите внимание, что go install поместил объект newmath.a в каталог pkg/linux_amd64, который является зеркалом каталога с исходным кодом. Это для того, чтобы в будущем при вызове go, он мог найти объект пакета избегая лишней его перекомпиляции. linux_amd64 является частью средств кросс-компиляции и отражает операционную систему и архитектуру вашей системы.

Исполняемые программы Go имеют статическую компоновку. Для работы Go программы не требуются объекты пакетов.

Названия пакетов.


Первым оператором в исходном коде Go должен быть

package name

где name это название импортируемого пакета. (Все файлы в пакете, должны использовать такое же название.)

По соглашению в Go, названием пакета является последний элемент в пути импорта: пакет, импортируемый как “crypto/rot13” должен иметь название rot13.

В исходном коде исполняемого файла всегда должен использоваться package main.

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

Тестирование.


У Go есть простой тестовый фреймворк, состоящий из команды go test и пакета testing.

Вы пишите тест, создавая файл, имя которого заканчивается _test.go, в котором находятся функции с именем TestXXX и сигнатурой func (t *testing.T). Тестовый фреймворк выполняет каждую функцию. Если вызов функции завершается t.Error или t.Fail, то считается, что тест не удался.

Добавьте тест для пакета newmath, создав файл $GOPATH/src/github.com/user/newmath/sqrt_test.go со следующим кодом Go.

package newmath

import "testing"

func TestSqrt(t *testing.T) {
 const in, out = 4, 2
 if x := Sqrt(in); x != out {
  t.Errorf("Sqrt(%v) = %v, want %v", in, x, out)
 }
}

Затем запустите тестирование с go test:

$ go test github.com/user/newmath
ok   github.com/user/newmath 0.165s

Как всегда, если вы выполняете go из каталога пакета, то можете опустить путь к пакету:

$ go test
ok   github.com/user/newmath 0.165s

Для получения большей информации о go test и пакете testing просмотрите документацию.

Удаленные пакеты.


Путь импорта может описывать как получить исходный код пакета, используя системы управления версиями, такие как Git или Mercurial. Go использует такое свойство для автоматической выборки пакетов из удаленных репозитариев. Например, в описываемом примере, этот документ сохраняется в репозитарии Mercurial размещенном в Google Code, code.google.com/p/go.example. Если вы включите в путь импорта пакета URL репозитария, то go get сможет выбирать, собирать и инсталлировать его автоматически:

$ go get code.google.com/p/go.example/hello
$ $GOPATH/bin/hello
Hello, world.  Sqrt(2) = 1.414213562373095

Если указанного пакета нет в рабочей области, go get сначала поместит его в рабочею область, указанную в GOPATH. (Если пакет уже есть в рабочей области, то go get будет вести себя так, как будто была выполнена go install).

После выполнения команды go get, три каталога рабочей области должны выглядеть так:

bin/
    hello                 # command executable
pkg/
    linux_amd64/
        code.google.com/p/go.example/
            newmath.a     # package object
        github.com/user/
            newmath.a     # package object
src/
    code.google.com/p/go.example/
        hello/
            hello.go      # command source
        newmath/
            sqrt.go       # package source
            sqrt_test.go  # test source
    github.com/user/
        hello/
            hello.go      # command source
        newmath/
            sqrt.go       # package source
            sqrt_test.go  # test source


© Перевод: www.golangpro.ru

Комментариев нет:

Отправить комментарий