Разработка в Go: полезные советы для новичков

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

Использование внешнего кода

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

Но, конечно, есть и обратная сторона медали: поскольку на данный момент в открытом доступе лежит огромное количество пакетов, найти действительно качественный код, который можно применить в разработке приложений, становится все труднее. Среди доступных пакетов следует выделить специальные gem-ы go-tigertonic и testify, которые предоставляют много полезных функций.

Также существует несколько репозиториев пакетов (хотя ни один из них не считается стандартным) и сервисов оповещений (например, OSS Go). Правда, такие сервисы не очень полезны, если вы ищете что-то конкретное.

На данный момент эта проблема остается нерешенной. Однако Go имеет секретное оружие: это стандартная библиотека Go. Она невероятно надёжная, и в ней можно найти решение почти для любой проблемы (если, конечно, вы не ищете какое-то узкопрофильное средство).

Интеграция внешнего кода

Добавляя внешние пакеты, очень важно помнить о том, что при этом ваше приложение не должно стать внешним пакетом для вас. Речь идёт вот о чём: внешние интерфейсы Go могут измениться, ваша команда может решить, что необходимо заменить систему бэкенда чем-то более надежным, и тогда при перемещении ваш пакет может получить импортируемый тип. Используйте интерфейсы Go, чтобы изолировать приложение от типов импортированных пакетов; это позволит вам сфокусироваться на выполнении потребностей вашего проекта, а не на разработке приложения на основе ядра, которое вам не принадлежит.

Предположим, вы используете внешний клиент Redis, который экспортирует следующее:

package redis
type Redis struct {}
func (r *Redis) Get(k string) (*RedisKVPair, error) { // omited}

Этот код можно использовать в своём приложении, но при этом вы столкнётесь с двумя проблемами: во-первых, для тестирования кода такого пакета потребуется сервер Redis; во-вторых, обновить такой клиент Redis будет не так просто.

С помощью интерфейса Go можно определить необходимое поведение:

package myapp
type KeyPair struct {
Key string
Value []byte
}
type KeyStore interface {
Get(k string) (*KeyPair, error)
}

После этого можно создать собственный тип, который охватит внешний пакет:

package myapp
func NewRedisKeyStore() {
return &RedisKeyStore{
r: redis.Redis{},
}
}
func (rks *RedisKeyStore) Get(k string) (*KeyPair, error) {
rkvp, err := rks.r.Get(k)
if err != nil {
return nil, err
}
return &KeyPair{
Key: rkvp.Key,
Value: rkvp.Value,
}, nil
}

Затем вместо внешнего клиента Redis вы можете использовать свой тип.

type MockKeyStore struct {
Dict map[string][]byte
}
func NewMockKeyStore() {
return &MockKeyStore{
Dict: map[string][]byte{},
}
func (mks *MockKeyStore) Get(k string) (*KeyPair, error) {
return &KeyPair{Key: k, Value: mks.Dict[k]}, nil
}

Управление зависимостями

Со временем пакеты, которые вы используете в проекте, обновятся, в них появятся исправления и новые функции. Работая с Go, вы быстро заметите, что команда go get – не самое надёжное средство для управления зависимостями. Есть два средства, которые стоит попробовать вместо go get: вендоринг зависимостей и внешний инструмент godep.

Вендоринг пакетов иногда бывает слишком затратным.

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

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

Разработка в Go

У Go есть одно важное преимущество: этот язык программирования не требует IDE и большого количества ресурсов для продуктивной работы. Вы можете начать писать код в любом удобном текстовом редакторе. Конечно, при разработке можно запутаться в расширениях. Писать код Go можно в Sublime Text. Также вы можете использовать популярный плагин GoSublime, который предоставляет много полезных функций, например форматирование и автозавершение кода. Плагин Vim Go тоже пользуется спросом.

Ещё один полезный инструмент называется Oracle. Он выполняет анализ исходного кода, что очень пригодится вам в разработке проекта. Oracle распознаёт выражения, типы и вызываемые методы, потому интеграция этого инструмента в текстовые редакторы сильно увеличит производительность разработки. Если вы работаете с the Atom или Emacs, попробуйте поработать с Oracle.

Развёртывание Go

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

К примеру, вы можете создать Makefile:

VERSION=0.5.0
BUILD=$(shell git rev-list --count HEAD)
widget-dpkg:
mkdir -p deb/widget/usr/local/bin
cp $(GOPATH)/bin/widget  deb/widget/usr/local/bin
fpm -s dir -t deb -n widget -v $(VERSION)-$(BUILD) -C deb/widget .

Прежде чем начать собирать пакеты вручную, рассмотрите вариант использования системы непрерывной интеграции в качестве сборщика. Это обеспечит вам доступ к наиболее актуальным пакетам после каждой успешной сборки. Для непрерывной интеграции можно использовать Drone.IO.

Также можно создавать Makefiles для автоматизации задач.

Экосистема Go

Go предоставляет специальные инструменты, которые делают работу с экосистемой Go проще. Например, инструмент golint обнаруживает простые ошибки и опечатки и обеспечивает код минимальной документацией. Инструмент godoc предоставляет простой интерфейс для просмотра документации кода. Список рассылки Golang Nuts – просто бесценный ресурс.

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

Tags:

Добавить комментарий