Начинаем работу с Go

Если вы не прожили последние несколько лет на необитаемом острове, то должны были слышать о Go (иногда его называют Golang), языке программирования, представленном Google несколько лет назад.

Go определяют, как:

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

Согласно другому источнику, Go

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

Доступный с большинства современных операционных систем, включая Mac OS X, Linux, BSD и Microsoft Windows, он был задуман и первоначально разработан еще в 2007 году в Google Робертом Гризмером, Робом Пайком и Кеном Томпсоном. Каждый из этих трех разработчиков имеет впечатляющий послужной список.

Роберт Гризмер участвовал в создании в движка V8 JavaScript от Google и виртуальной машины Java HotSpot; Роб Пайк и Кен Томпсон занимались в Bell Labs реализацией оригинальной операционной системы UNIX.

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

Переходим к установке

Независимо от того, пользуетесь ли вы Mac OS X, Linux и FreeBSD или Windows, Go для всех этих систем прост в установке и настройке. В этой статье я буду исходить из того, что у вас на компьютере установлена операционная система UNIX / Linux. Когда я впервые ставил Go на Mac, я использовал файл последнего пакета.

Но вы можете так же легко установить его из исходника с помощью следующих команд:

tar -C /usr/local -xzf go1.2.1.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

Для тех, кто не знаком с этим способом — они извлекают копию файлов go из исходника go1.2.1.linux-amd64.tar.gz в папку вашей системы /usr/local/go, и добавляют папку bin в папку профиля вашего пользователя.

В том случае, если у вас стоит Windows, загрузите и запустите MSI Installer.

После завершения установки, вы найдете установленные файлы фреймворка в папке c:Go; и установщик должен добавить c:Gobin к переменной среды PATH. Вы можете проверить это, просто чтобы убедиться.

Конфигурирование среды

После этого мы получим двоичные файлы, необходимые для начала работы. Однако мы должны также подготовить нашу среду. Для этого нам нужно будет выполнить дополнительные действия.

Go использует для развития проектов концепцию рабочей области, которая содержит исходные файлы (SRC), скомпилированные двоичные файлы (BIN) и пакеты (PKG).

Структура каталога исходных файлов, как правило, строится по принципу хранилищ с открытым исходным кодом наподобие GitHub. Таким образом, стандартный исходный каталог может выглядеть следующим образом:

src
        github.com
        settermjd   
        sitepoint
                hello-world.go

Вы можете видеть, что в папке src я разместил папку, связанную с моим хранилищем на Github под названием sitepoint, в ней находится один файл, hello-world.go.

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

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

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

Выполнение следующей команды создаст необходимую структуру каталогов и установит переменную среды GOPATH:

mkdir -p /Users/settermjd/go/src/github.com/settermjd/sitepoint
export GOPATH=/Users/settermjd/go

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

Простое приложение

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

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

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

package main

Каждое приложение Go состоит из пакетов и программы с Java-ссылками, использующей по умолчанию основной пакет (package main):

import ( 
    "encoding/json"
    "fmt"
    "strings"
)

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

В приведенном выше коде я импортировала три пакета: encoding/json, fmt и strings. Если вам кажется, что это необычная практика, то это не так. В PHP и C нужно использовать включения (или требования), в Python вы бы использовали импорты, а в Ruby — требования.

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

type User struct {
    FirstName string `json:"first_name"`
    LastName string `json:"last_name"`
    Age int
    Languages []string `json:"languages"`
}

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

В приведенном выше примере, я объявил структуру, которая называется User. Она содержит четыре поля: FirstName, LastName, Age и Languages. На этом примере мы сможем рассмотреть использование некоторых из основных Типов данных Go. FirstName и LastName являются строками, Age является целым числом, Languages является массивом строк.

В конце каждого из этих полей, вы видите запись типа json:»first_name». Потенциально это немного выходит за рамки этого конкретного примера, она помогает отобразить поля структуры в виде полей строки JSON, о чем мы поговорим чуть позже:

func printUserData(jsonData string, age int) string {

В этом коде мы определили функцию printUserData, которая принимает два параметра: строку под названием jsonData и целое число под названием age, — и возвращает строку:

var output string

… объявляет переменную под названием output, которая выводит строку на экран:

res := &User{}

… объявляет переменную res и ее принадлежность к структуре User, которую мы определили ранее. Это пример одновременного определения переменной и ее инициализации в Go:

json.Unmarshal([]byte(jsonData), &res)

… вызов функции Unmarshal в пакете json, с передачей ей первого аргумента jsonData, и переменной структуры res:

if res.Age > age {
    output = fmt.Sprintf("User %s %s, who's %d can code in the following languages: %sn", res.FirstName, res.LastName,  res.Age, strings.Join(res.Languages, ", "))    
} else {
    output = fmt.Sprintf("User %s %s must be over %d before we can print their details", res.FirstName, res.LastName, age)
}

Этот раздел кода, скорее всего, покажется вам хорошо знакомым, независимо от того, работали ли вы с PHP, Java, C / C + +, Python, Ruby или JavaScript; кроме одной небольшой мелочи.

В Go для оператора if применяются не скобки, а фигурные скобки. Здесь я проверяю, является ли возраст человека, в преобразованном объекте JSON, больше, чем возраст, который был передан функции в качестве второго аргумента.

Если это так, мы выводим на экран полное имя, возраст и язык, на котором разговаривает этот человек. Если нет, мы выводим другое сообщение, в котором говорится, что мы не можем предоставить о нем подробную информацию.

Здесь приведены примеры еще двух стандартных пакетов библиотек: fmt.Sprintf и strings.Join. Я выбрал их намеренно, так как это, вероятно, наиболее часто используемые веб-сценарии в основных языках программирования, особенно в PHP.

fmt.Sprintf заменяет предлагаемыми значениями заполнители в строке первого аргумента. Так как языки программирования представляют собой массив, я использовал функцию strings.Join (аналогичную РНР — функции implode), чтобы преобразовать массив в строку, разделяя элементы с помощью «‘,».

Затем результат присваивается выходному значению переменной строки:

return output
}

В конце функции, мы возвращаем результат:

func main() {
    var age int = 24
    str := `{"first_name": "Matthew", "last_name": "Setter", "age": 21, "languages": ["php", "javascript", "go"]}`
    fmt.Println(printUserData(str, age))
}

Приложение Go запускается главной функцией основного пакета. Так я реализовал основной пакет, инициализируя целую переменную для значения 24, затем инициализировал переменную строки str для простой JSON-строки.

Вы можете видеть, что она содержит четыре компонента:

  • имя;
  • фамилию;
  • возраст;
  • языки.

В конце я вызвал метод fmt.Println, передавая в него вызов функции printUserData, в которой я передавал переменные str и age.

Компиляция кода

В отличие от PHP, Ruby, Python и других, Go является компилируемым языком. Поэтому вам из каталога проекта, в моем случае /Users/settermjd/go/src/github.com/settermjd/sitepoint, нужно выполнить следующую команду:

go install

В результате чего в каталоге bin/ будет составлен двоичный файл с названием sitepoint от имени пакета. Чтобы запустить его, просто вызовите его так же, как вызывается любой двоичный или исполняемый файл, например:

$GOPATH/bin/sitepoint

В результате вы получите:

User Matthew Setter must be over 24 before we can print their details

В заключении

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

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

Перевод статьи «Getting Started with Go» был подготовлен дружной командой проекта Сайтостроение от А до Я.