Go получил славу одного из самых простых языков программирования, в числе его плюсов – простота написания и чтения кода, в большинстве случаев более простая поддержка кодовой базы. Рассказываем о нескольких преимуществах Go, благодаря которым мы в SimbirSoft использовали его в ряде высоконагруженных проектов с различными архитектурами, как веб-сервисными, так и микросервисными (SOA).
Этот системный язык хорош для большинства сетевых задач, любых микросервисов и макросервисов, веб-сервисов, а также для системных инструментов – недаром его любят многие специалисты DevOps. Go находит свое применение в Machine Learning, а некоторые разработчики даже пишут с его помощью веб-сайты. Мы в своей практике обращались к Go, когда разрабатывали отдельные CRM и программные продукты для внутреннего пользования, например, для страховых компаний. В стандартном репозитории языка Go есть пакет и для мобильной разработки, данный пакет поддерживается до сих пор, хотя для этого есть более подходящие инструменты.
В Google разработка языка Go началась в 2007 году. До этого компания использовала Java, Python и C++, однако, они имели определенные недостатки (в частности, большое потребление памяти) или ограниченное применение. Тогда в Google начали разработку нового языка под свои нужды.
Какие требования предъявлялись к языку:
Для тех, кто не работает с Go, вкратце напомним историю его создания. Спецификацию языка в Google начали продумывать в 2007 году. Релиз 1.0 состоялся в 2012 году, а в 2015 году вышел релиз 1.5, уже без единой строчки кода C++. С этого момента язык компилирует себя сам, что позволило ускорить разработку отдельных задач на Go.
Средний возраст признания нового языка в сообществе – около 10 лет, но Go уже сейчас входит в число наиболее востребованных языков. В июне 2019 года Go поднялся на 15 место по популярности в мире, согласно индексу TIOBE, прибавив за год три позиции. Среди причин его успеха можно выделить следующие:
Например, в стандартную библиотеку входят следующие пакеты (список неполный):
![](https://habrastorage.org/r/w780q1/webt/8u/qj/qd/8uqjqdlmz-0crdwb5iyjkpyukdc.jpeg)
Иллюстрация – github.com/ashleymcnamara/gophers
Если вас не устраивает скорость работы вашего приложения или другие параметры, вы можете поработать с профилировщиком из “коробки”. Для этого нужно:
Одно из преимуществ Go – обширный набор стандартных инструментов. Мы выбрали несколько наиболее интересных утилит, на наш взгляд (на самом деле, их намного больше):
Еще одна сильная сторона Go заключается в том, что на этом языке легко написать конкурентный код. Для этого вы просто перед вызовом функции используете ключевые слова.
![](https://habrastorage.org/r/w780q1/webt/ik/a_/6q/ika_6qkidzulqz5in4-jjtk5lay.jpeg)
Если вы хотите программировать на Go, старт займет относительно немного времени. Разработчики — Core Team — поддерживают курс A Tour of Go на нескольких языках, в том числе на русском. Этот курс можно пройти буквально за 1-3 дня. В отношении обучения Go — один из самых простых языков.
Итак, что почитать:
Есть мнения, что одним из слабых мест Go являются ORM. Возможно, отчасти это происходит из-за того, что язык молод — в нем только начинают разрабатывать многие необходимые инструменты. В частности, для работы с базами данных можно использовать пакет database/sql. Какие требования предъявляются к пакету:
Как видно из примера, очень много шаблонных действий придется выполнять каждый раз. Например:
Из всего этого хочется использовать что то более универсальное и простое, например, ORM.
Когда перед разработчиками встает вопрос выбора ORM для работы с Go, они зачастую ориентируются по рейтингу на гитхабе. Когда мы выбирали ORM для себя, лучший рейтинг имел Beego (18 тысяч “звездочек”). Однако, на практике ORM входит в состав фреймворка, поэтому оценка не вполне объективна (если выбирать исключительно ORM). Также в числе лидеров Gorm, который развивается с 2013 года, поддерживает транзакции и имеет много других преимуществ.
![](https://habrastorage.org/r/w780q1/webt/4t/lk/up/4tlkupvoryxwcybeiobknmqkyze.jpeg)
Однако, как показал наш опыт знакомства с Gorm, при его использовании возможны определенные проблемы, особенно при тестировании: например, гонка данных или c удалением foreign key. Можно предположить следующие причины подобных ошибок в Gorm:
На данный момент мы в своей работе отдаем предпочтение нескольким ORM, которые не используют interface{} — это Kallax, Reform и Sqlboiler. Обычно задействуем пакет Golang для миграций и репозиторий orm-bench с бенчмарками ORM на Go. При этом не стоит гнаться только за бенчмарками. Чаще скорость не так важна, как качество кода и его функциональность.
К преимуществам языка Go для разработчика и для бизнеса можно отнести повышение производительности разработки, возможность использовать меньшее количество серверов, синтаксическую легкость и быстрые сроки обучения новых разработчиков, большой набор инструментов и дружелюбное комьюнити. Несмотря на то, что это молодой язык, он постоянно растет и развивается. Особенности Go делают его оптимальным языком для выполнения самых разных проектов, от сетевых задач до микросервисов и блокчейна.
Статья подготовлена на основе нашего доклада на митапе Hot Backend в Самаре.
Спасибо за внимание!
Авторские материалы для backend-разработчиков мы также публикуем в наших соцсетях – ВКонтакте и Telegram.
Применение
Этот системный язык хорош для большинства сетевых задач, любых микросервисов и макросервисов, веб-сервисов, а также для системных инструментов – недаром его любят многие специалисты DevOps. Go находит свое применение в Machine Learning, а некоторые разработчики даже пишут с его помощью веб-сайты. Мы в своей практике обращались к Go, когда разрабатывали отдельные CRM и программные продукты для внутреннего пользования, например, для страховых компаний. В стандартном репозитории языка Go есть пакет и для мобильной разработки, данный пакет поддерживается до сих пор, хотя для этого есть более подходящие инструменты.
Go: развитие и признание
В Google разработка языка Go началась в 2007 году. До этого компания использовала Java, Python и C++, однако, они имели определенные недостатки (в частности, большое потребление памяти) или ограниченное применение. Тогда в Google начали разработку нового языка под свои нужды.
Какие требования предъявлялись к языку:
- Один исполняемый файл (отсутствие зависимостей)
- Быстрая компиляция
- Быстрый runtime (как минимум наравне с Java и С++)
- Сборщик мусора, минимизация утечки ресурсов
- Оптимизация под многопроцессорные системы
- Статическая типизация
- Минимализм
- Синтаксическая легкость
- Мультипарадигменность (императивный, функциональный, объектно-ориентированный)
Для тех, кто не работает с Go, вкратце напомним историю его создания. Спецификацию языка в Google начали продумывать в 2007 году. Релиз 1.0 состоялся в 2012 году, а в 2015 году вышел релиз 1.5, уже без единой строчки кода C++. С этого момента язык компилирует себя сам, что позволило ускорить разработку отдельных задач на Go.
Средний возраст признания нового языка в сообществе – около 10 лет, но Go уже сейчас входит в число наиболее востребованных языков. В июне 2019 года Go поднялся на 15 место по популярности в мире, согласно индексу TIOBE, прибавив за год три позиции. Среди причин его успеха можно выделить следующие:
- Сильная стандартная библиотека
- Крутой стандартный тулинг
- Наиболее необходимые функции представлены в “коробке”, а библиотеки отданы на open source
- Очень дружелюбное сообщество
Например, в стандартную библиотеку входят следующие пакеты (список неполный):
![](https://habrastorage.org/webt/8u/qj/qd/8uqjqdlmz-0crdwb5iyjkpyukdc.jpeg)
Иллюстрация – github.com/ashleymcnamara/gophers
Если вас не устраивает скорость работы вашего приложения или другие параметры, вы можете поработать с профилировщиком из “коробки”. Для этого нужно:
- Зарегистрировать импорт профилировщика: import _ «net/http/pprof»
- Добавить http-сервер для получения результатов от профилировщика: go http.ListenAndServe(«0.0.0.0:8080», nil)
Go tools
Одно из преимуществ Go – обширный набор стандартных инструментов. Мы выбрали несколько наиболее интересных утилит, на наш взгляд (на самом деле, их намного больше):
- benchcmp — сравнение бенчмарков, производительности до и после изменений
- go tool cover — анализ покрытия кода тестами
- godoc — генерация документации на основе комментариев
- goimports — анализ импортов (удаление неиспользуемых, добавление пропущенных)
- gorename — рефакторинг
- present — тулинг для презентаций
- go vet — линтер часто встречающихся ошибок
- go test — запуск тестов и бенчмарков
- go fix — фикс изменений при смене API (до релиза 1.0)
- go tool pprof — профилирование
- Go fmt — форматирование кода по code style
- Race detector — нахождение гонки данных в runtime
Конкурентность
Еще одна сильная сторона Go заключается в том, что на этом языке легко написать конкурентный код. Для этого вы просто перед вызовом функции используете ключевые слова.
![](https://habrastorage.org/webt/ik/a_/6q/ika_6qkidzulqz5in4-jjtk5lay.jpeg)
Обучение Go
Если вы хотите программировать на Go, старт займет относительно немного времени. Разработчики — Core Team — поддерживают курс A Tour of Go на нескольких языках, в том числе на русском. Этот курс можно пройти буквально за 1-3 дня. В отношении обучения Go — один из самых простых языков.
Итак, что почитать:
ORM в Go
Есть мнения, что одним из слабых мест Go являются ORM. Возможно, отчасти это происходит из-за того, что язык молод — в нем только начинают разрабатывать многие необходимые инструменты. В частности, для работы с базами данных можно использовать пакет database/sql. Какие требования предъявляются к пакету:
- Общий пакет для всех sql баз данных
- Портируемый: не содержит никаких особенностей в области работы с базами данных. В идеале все должно корректно работать, если вы поменяете драйвер.
- Преобразование типов Go в стандартные типы базы данных (при этом должна быть возможность обработки специфичных типов)
- Содержит пул соединений
- Thread-safety для горутин
Пример SELECT запроса с использованием database/sql
defer rows.Close()
for rows.Next() {
var message string
err := rows.Scan(&message)
if err != nil {
log.Panic(err)
}
fmt.Println(message)
}
if err := rows.Err(); err != nil {
log.Panic(err)
}
Как видно из примера, очень много шаблонных действий придется выполнять каждый раз. Например:
- закрывать объект rows: defer rows.Close()
- проверять на ошибки err := rows.Err(); err != nil т.к. не понятно по какой причине rows.Next() вернул нам значение false
Из всего этого хочется использовать что то более универсальное и простое, например, ORM.
Виды реализаций ORM
Когда перед разработчиками встает вопрос выбора ORM для работы с Go, они зачастую ориентируются по рейтингу на гитхабе. Когда мы выбирали ORM для себя, лучший рейтинг имел Beego (18 тысяч “звездочек”). Однако, на практике ORM входит в состав фреймворка, поэтому оценка не вполне объективна (если выбирать исключительно ORM). Также в числе лидеров Gorm, который развивается с 2013 года, поддерживает транзакции и имеет много других преимуществ.
![](https://habrastorage.org/webt/4t/lk/up/4tlkupvoryxwcybeiobknmqkyze.jpeg)
Однако, как показал наш опыт знакомства с Gorm, при его использовании возможны определенные проблемы, особенно при тестировании: например, гонка данных или c удалением foreign key. Можно предположить следующие причины подобных ошибок в Gorm:
- Коммиты сразу в master
- Отсутствие тегов
- Непредсказуемый sql билдер
На данный момент мы в своей работе отдаем предпочтение нескольким ORM, которые не используют interface{} — это Kallax, Reform и Sqlboiler. Обычно задействуем пакет Golang для миграций и репозиторий orm-bench с бенчмарками ORM на Go. При этом не стоит гнаться только за бенчмарками. Чаще скорость не так важна, как качество кода и его функциональность.
Подводя итоги
К преимуществам языка Go для разработчика и для бизнеса можно отнести повышение производительности разработки, возможность использовать меньшее количество серверов, синтаксическую легкость и быстрые сроки обучения новых разработчиков, большой набор инструментов и дружелюбное комьюнити. Несмотря на то, что это молодой язык, он постоянно растет и развивается. Особенности Go делают его оптимальным языком для выполнения самых разных проектов, от сетевых задач до микросервисов и блокчейна.
Статья подготовлена на основе нашего доклада на митапе Hot Backend в Самаре.
Спасибо за внимание!
Авторские материалы для backend-разработчиков мы также публикуем в наших соцсетях – ВКонтакте и Telegram.