Python или Go что лучше: разбираемся в нюансах выбора
Go, он же Golang — это статический, типизированный язык программирования. Его разработали программисты компании Google в качестве альтернативы таким языкам , как C, C++ и Java. Go собрал в себе все лучшее от этих «старших собратьев» и презентует эти возможности с заметной легкостью. Считается, что те, кто знаком с С-подобными языками, легко разберется и с Golang, так как он имеет с ними много общего. Сфера применения его обширна — он применяется везде, где можно применить С, С++, Java , т о ест ь в р азработк е веб-приложений, серверной части приложений, драйверов и др.
Python — язык общего назначения, который уже долгие годы входит в число самых популярных языков программирования. Вообще , это объектно-ориентированный, интерпретируемый, высокоуровневый язык программирования. Разработан еще в 1991 году, однако популярным стал только в последние 10-15 лет за счет того, что человечество вошло в эпоху искусственного интеллекта. А при работе с искусственн ы м интеллект ом Python является языком-лидером. Сфера применения обширна, но основная его деятельность — это искусственный интеллект, машинное обучение, большие данные, серверная часть приложений.
Go или Python: производительность
- бинарный поиск,
- сортировка «пузырьком»,
- чтение из текстового файла,
- обработка HTTP-запроса,
- решение уравнения Мандельброта,
- решение «проблемы классической механики»,
- обработка последовательностей для извлечения нуклеотидных данных.
Go или Python: масштабируемость программ
Масштабируемость программы — это ее способность справляться с повышением нагрузки при текущем количестве ресурсов, а также сохранение производительности при добавлении ресурсов. Возможность масштабировать приложение — это приоритетная черта современных подходов к разработке.
Go изначально был рассчитан для работы в высоконагруженных системах, так как в основе его создания лежат языки из той же области. C, C++, Java не боятся больших нагрузок , и Go заимствовал у них это свойство. На данном языке можно написать масштабное серверное приложени е , над которым будут трудит ь ся тысячи программистов.
Python в этом плане уступает , н о в нем для масштабируемости приложений есть отличное свойство — параллелизм. Параллелизм означает, что крупные задачи программы можно разбить на более мелкие подзадачи и выполнять их параллельно. Такие подзадачи не потребляют много системных ресурсов, поэтому в большинстве случаев предпочтительны. Таким образом, поток дополнительной нагрузки приложения в Питоне может разбиваться на несколько параллельных подзадач, что не влияет на производительность самой программы.
Параллелизм считается идеальным вариантом для масштабирования программ , п оэтому можно сказать, что оба языка в этом плане одинаковы, но используют разные подходы.
Go или Python: принцип работы
Go или Python обладают собственными принципами работы , п оэтому и невозможно достоверно их сравнить. Благодар я т ому , что у них разные принципы и подходы, эти языки применяются в разных сферах программирования. Как мы уже писали, Go — это больше системное и серверное программирование, а Python — это искусственный интеллект, машинное обучение и анализ Big Data.
Если попытаться сравнить Go и Python для искусственного интеллекта, то Питон , безусловно , будет лидером по всем параметрам. Если попытаться сравнить Go и Python для написания операционной системы, то Go будет безусловным лидером.
То ест ь к омплексно сравнить Go и Python по принципу работы не получится. Если их сравнивать, тогда в каждом конкретном случае.
Go или Python: библиотеки
- Django — для веб-разработки ;
- Numpy — для обработки сложных математических функций ;
- TensorFlow — для машинного обучения ;
- OpenCV — для реализации компьютерного зрения ;
- Pandas — для работы с big data ;
- Matplotlib — для анимации и визуализации ;
- и др.
Go или Python: строгость синтаксиса
Питон обладает простым, понятным и читаемым синтаксисом. Его код очень просто читать. Обязательные отступы в синтаксисе заставляют разработчиков писать понятные и читабельные программы. В глобальном смысле это помогает одному разработчику с легкостью читать код другого.
У Go свой подход к реализации синтаксиса. Он по — своему строгий , о днак о т ак как он создан на основе С-образных языков, то и синтаксис у него похож на эти языки , п оэтому новичк ам Go п окажется достаточно сложным для понимания. Хотя опытные разработчики утверждают, что его синтаксис не настолько сложный , как у С или С++.
Go или Python: зарплата и востребованность
- опыт в программировании;
- знание дополнительных инструменто в т ипа GIT, SQL, Linux, английск ого язык а и др.;
- месторасположение компании-работодателя ;
- уровень компании-работодателя;
- и др.
- Python — это 40-160 тысяч рублей ;
- Go — это 50-150 тысяч рублей.
Заключение
Что выбрать : Go или Python? Каждый из этих языков отлично справляется с работой в своей нише. А это значит, что выбор нужно начинать именно с этого пункта. То ест ь для начала нужно понять, для чего вам язык и что вы на нем собираетесь писать . Исходя из ответа, уже можно будет выбирать : Go или Python. Причем такой подход касается и новичков. Для начала нужно определиться, в какой сфере вы хотите состояться как программист, а только потом выбирать между языками. Есть вероятность, что вам не нужен будет ни Go , ни Python, а какой-нибудь Java, Kotlin, Swift, JavaScript или PHP.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Python vs. Go: почему компании переходят от первого ко второму
Если вы в ходе работы встречали разработчиков, мигрирующих с Python на Golang, и задумываетесь о переходе, то эта статья для вас.
Python и Go (также известный как Golang) — это два разных языка программирования, каждый со своими уникальными особенностями и применениями. Если вы в ходе работы встречали разработчиков, мигрирующих с первого ЯП на второй, и задумываетесь о переходе, то эта статья для вас. Вот некоторые ключевые различия между языками:
1. Создание и разработка
Python был создан в 1980-х как интерпретируемый язык, в котором код читается не самой машиной, а специальной предваряющей программой – интерпретатором. Go, в свою очередь, создали в Google в 2007 году. Это компилируемый язык, нацеленный быть быстрее Python. Во втором случае машина “переводит” код самостоятельно, что и добавляет скорости.
Создатели языка (слева направо): Роберт Гризмер, Роб Пайк, Кен Томпсон на Google I/O, 2012
2. Производительность
Согласно статьe doit.software, Go быстрее в 30 раз. Привычная построчная обработка записей – вырезка подстрок, удаление разметки и т.д. – часто “вешают” питонический ноутбук на все два часа, пока условный Colab хранит сессию открытой. Golang здесь даст приятный прирост. В моем случае вместо 40 минут на предварительную подготовку данных потрачено 27 минут. Инвестиция временем создателей окупается сторицей у пользователей ЯП.
3. Параллелизм
Go имеет встроенную поддержку конкурентности и параллелизма с использованием goroutines (легковесные потоки), что делает его отличным выбором для разработки многопоточных приложений. Python также может поддерживать параллелизм, но это обычно сложнее реализовать и часто подвержено «Global Interpreter Lock» (GIL), то есть пресловутой блокировке одним потоком.
4. Синтаксис и удобство использования
Python известен своим простым и понятным синтаксисом, который делает его особенно полезным для новичков в программировании. Go также стремится к простоте и предсказуемости, но его синтаксис может быть менее интуитивным для новичков.
Переменная a эквивалентна i; b – j.
Сравните, сколько строк потребовалось для вывода суммы двух переменных в случае Python и Go на изображении выше. Но все же легкочитаемостью кода жертвуют, чтобы пользователь получил возможность взаимодействовать с продуктом, завязанным на больших данных.
5. Сообщество и экосистема
Python имеет одно из самых больших и активных сообществ программистов с огромным количеством сторонних библиотек и фреймворков. Go также имеет активное сообщество, но оно меньше, чем у Python.
Для сравнения, у Python более 8,2 миллионов активных пользователей (источник – zdnet.com), у Go – 1,1 миллиона (jetbrains.com).
6. Области применения
Python широко используется в научных вычислениях, анализе данных, машинном обучении и веб-разработке. Если компания занимается развертыванием облачных сервисов, то большее предпочтение отдаст Golang.
Заключение
На мой взгляд, перед нами только начинает разворачиваться эта интереснейшая битва языков-гигантов. Пройдет еще десяток-другой лет, и мы, скорее всего, увидим еще больший расцвет обоих технологий в разных областях.
В случае моей компании, переход на Golang пока не имеет смысла: с большими данными мы пока не работаем. С нашими датасетами из текста объемом до 3 гигабайт каждый Python справляется достаточно быстро. К примеру, в условиях теста уже пятой по счету ML-модели, классифицирующей обращения пользователей “без учителя”, гораздо проще и быстрее вырезать небольшой слайс, чем при сотом запуске прогонять весь набор данных через какую-нибудь медленную функцию на каждый ряд.
В общем, выбирая ЯП, учитывайте объем данных, с которыми работаете, “соприкасается” ли этот код напрямую с конечным пользователем или же остается в рамках, скажем, аналитического проекта. Немаловажно наличие у вас и команды желания осваиваться на новом поприще – такие апгрейды требуют немало времени.
Что учить сейчас Python или Golang?
Что лучше новичку учить для бэкенда Python или Golang? Многие советуют Go но по нем сейчас не так много информации для изучения начинающему если ты ничего не знаешь, а по Python куча всего. Ну и на Go как я слышал переходят с других языков например с PHP. Какие можете дать советы?
Henry
26.01.23 14:04:15 MSK
- Ответить на это сообщение
- Ссылка
← 1 2 3 4 5 6 7 →

Для бэка, кмк, более подходит Go. Скорость разработки думаю будет ниже (за счет того, что Python — более высокоуровневый и слаботипизированный), но производительность и расход ресурсов явно сильный аргумент в сторону Go. Но python вообще, более универсальный язык, в случае если захочется выйти за рамки бэка.
Demacr ★★
( 26.01.23 14:10:40 MSK )
Последнее исправление: Demacr 26.01.23 14:11:08 MSK (всего исправлений: 1)
- Ответить на это сообщение
- Показать ответы
- Ссылка
Что лучше новичку учить для бэкенда
Посмотерть вакансии бэкендеров, отсеять легаси и решить на основании спроса. Освоить, и понять что рынок изменился и надо учить что-то ещё.
Так что, не ЯП надо учить, а как можно быстрее влиться в разработку и следовать за рынком.
vvn_black ★★★★★
( 26.01.23 14:12:04 MSK )
Последнее исправление: vvn_black 26.01.23 14:28:11 MSK (всего исправлений: 1)
- Ответить на это сообщение
- Показать ответы
- Ссылка
Я бы сказал что оба востребованы, но python популярнее. Если нет объективного критерия (а-ля в конторе куда ты хочешь пишут на), выбери какой больше нравится, а второй изучи хотя бы по верхам.
У обоих языков качественная официальная документация. Остальное — кривые васянские гайды и книжонки, не надо их даже смотреть.
slovazap ★★★★★
( 26.01.23 14:13:23 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка

Лучше учить оба, так как языки имеют общую нишу применения, близки идеологически и зачастую используются одними и теми же компаниями
annulen ★★★★★
( 26.01.23 14:17:04 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка

В го гораздо больше геморроя и гораздо меньше логики.
А аргументы про «быстрее работает» посылаются в модули на ассемблере.
Ничего не мешает вынести все тяжёлые вычисления в эти модули.
Мешает только вопрос «нужны ли эти вычисления тут вообще».
Если и правда нужны, то пиши вычисления на том что для них больше всего подходит и интерфейс к этому на питоне.
Goury ★★★★★
( 26.01.23 14:53:30 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка
Лучше всего go конечно, там один бинарник на выходе получается, запихиваешь его в докер контейнер from scratch и хоть в продакшен. А на питоне заманаешься свой хелловорлд в контейнер запихивать чтобы никто не доколупался
slyjoeh ★★★
( 26.01.23 14:57:48 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка
Я заметил, что сейчас рынок очень мощно ужел в node.js. У меня, старого жабиста, уже хлеб отбирают и говорят, что я легаси.
untitl3d ★
( 26.01.23 15:02:08 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка
Бэкенд понятие растяжимое конечно. Но по-моему оба недоязыка там что корове седло. А писать все равно будете на том, на чём прикажут. И вероятнее всего на PHP.
bread ★
( 26.01.23 15:13:04 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка
Ответ на: комментарий от untitl3d 26.01.23 15:02:08 MSK

У меня, старого жабиста, уже хлеб отбирают и говорят, что я легаси.
А жабисты пусть едят пирожные.
Aber ★★★★★
( 26.01.23 15:13:25 MSK )
- Ответить на это сообщение
- Ссылка
лучше штангу поднимать. А те, кто пишет на Go back — уже заготовлен отдельный котёл.
JleHb
( 26.01.23 15:17:00 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка

Все от цели зависит. Если чисто шкурный интерес в духе вайтивайти, то подойдут оба два, если же цель более фундаментально то Го выглядит интересней — в нем хоть указатели есть есть, про GC много говорят.
urxvt ★★★★★
( 26.01.23 15:17:44 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от JleHb 26.01.23 15:17:00 MSK

Чем он хуже других языков в этой нише?
urxvt ★★★★★
( 26.01.23 15:18:21 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от urxvt 26.01.23 15:18:21 MSK
Я, как профессионал, могу тебе напомнить владельца «свободы», это, «барабанная дробь» — MS!
Лучшее, что есть на рынке: npm и c#.
JleHb
( 26.01.23 15:21:27 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка
Ответ на: комментарий от vvn_black 26.01.23 14:12:04 MSK
Я просто не знаю даже на какой рынок вакансии лучше ориентироваться, в моём регионе не так много вакансии веб Python(Django) всего 33, по Goland примерно также , я из Казахстана
Henry
( 26.01.23 15:32:00 MSK ) автор топика
- Ответить на это сообщение
- Показать ответы
- Ссылка

вначале учишь питон, а потом го
umren ★★★★★
( 26.01.23 15:32:53 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от annulen 26.01.23 14:17:04 MSK
Оба конечно лучше , но мне для начала хотя бы на одном писать нормальный код
Henry
( 26.01.23 15:33:22 MSK ) автор топика
- Ответить на это сообщение
- Показать ответы
- Ссылка
Ответ на: комментарий от Henry 26.01.23 15:33:22 MSK

Если вообще нулевой опыт программирования, то наверное лучше с питона начать
annulen ★★★★★
( 26.01.23 15:34:19 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от Henry 26.01.23 15:33:22 MSK
но мне для начала хотя бы на одном писать нормальный код
И что за задачи ты собрался на нём решать? И что такое ‘нормальный’?
JleHb
( 26.01.23 15:38:38 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от Henry 26.01.23 15:33:22 MSK
А, так ты из этих? Ну напиши нам, интересно, почему именно так ты хочешь коверкать пунктуацию?
JleHb
( 26.01.23 15:40:17 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка
Ответ на: комментарий от JleHb 26.01.23 15:40:17 MSK
На next регистрации?
JleHb
( 26.01.23 15:40:47 MSK )
- Ответить на это сообщение
- Ссылка

При таком выборе я бы советовал Go, это современный, статически типизированный язык, после него на python перейти будет легче, чем наоборот, с python на go.
Aber ★★★★★
( 26.01.23 15:43:45 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от JleHb 26.01.23 15:21:27 MSK

fluorite ★★★★★
( 26.01.23 15:45:32 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка

Стажером иди куда-нибудь. Реальная разработка сильно отличается от «изучения языка» и пет-прожектов. Это примерно как учиться плавать по книжке ни разу не зайдя в воду.
upcFrost ★★★★★
( 26.01.23 15:46:04 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от JleHb 26.01.23 15:40:17 MSK
Henry
( 26.01.23 15:48:58 MSK ) автор топика
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от fluorite 26.01.23 15:45:32 MSK
А то я не знаю. Ха. Баба Ванга в треде!
JleHb
( 26.01.23 15:52:58 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от Henry 26.01.23 15:48:58 MSK
JleHb
( 26.01.23 15:54:33 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от JleHb 26.01.23 15:54:33 MSK
Что ты хочешь от меня? Не нравится что-то, не читай.
Henry
( 26.01.23 15:57:33 MSK ) автор топика
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от Henry 26.01.23 15:57:33 MSK
Это как так, не читать? Дай case на котором ты споткнулся в выборе ЯП. А я поверну дуло пушки в твою сторону. Без троллинга типа троллей тут не выжить.
JleHb
( 26.01.23 15:59:31 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от Henry 26.01.23 15:32:00 MSK
Я просто не знаю даже на какой рынок вакансии лучше ориентироваться
Что ж вы всё так прямолинейно воспринимаете и до конца не читаете. Смысл в том, что когда вы что-то выучите, оно будет уже не совсем актуально.
Поэтому, хорошо бы просто в разработку вкатиться с минимальными общими знаниями. ЯП по месту выучите.
vvn_black ★★★★★
( 26.01.23 16:02:18 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от bread 26.01.23 15:13:04 MSK

А писать все равно будете на том, на чём прикажут. И вероятнее всего на PHP
Соболезную. Чего уж там.
На самом деле уже лет десять как не видел php в продакшне. А чистый backend на нем наверное вообще никогда. Я не спорю, возможно оно и существует где-то.
А так в основном golang, python, nodejs и c# сейчас. И выбор стека обычно идет от задач.
adn ★★★★
( 26.01.23 16:02:52 MSK )
Последнее исправление: adn 26.01.23 16:03:20 MSK (всего исправлений: 1)
- Ответить на это сообщение
- Показать ответ
- Ссылка
Вакансий и документации по обоим полно. Бери то, что больше нравится. На мой взгляд питон проще, но это вкусовщина
Aswed ★★★★★
( 26.01.23 16:34:20 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от slyjoeh 26.01.23 14:57:48 MSK

Лучше всего go конечно, там один бинарник на выходе получается, запихиваешь его в докер контейнер from scratch и хоть в продакшен
чтобы бинарник на go можно было запихнуть в контейнер scratch, он должен быть статически слинкован. Что далеко не всегда тривиальная задача. Особенно с учетом что речь о бэкенде, где чуть меньше чем всегда подключается net/http
Lrrr ★★★★
( 26.01.23 16:40:02 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка

Go как первый язык кмк выглядит лучше, навскидку
- писать дичь сложнее
- отличная стандартная библиотека
- скорость и статические типы — приятно
- нет дремучего легаси
ddidwyll ★★★★
( 26.01.23 16:42:54 MSK )
Последнее исправление: ddidwyll 26.01.23 16:44:02 MSK (всего исправлений: 1)
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от Lrrr 26.01.23 16:40:02 MSK
С чем он должен быть статически слинкован?
slyjoeh ★★★
( 26.01.23 16:45:33 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от Lrrr 26.01.23 16:40:02 MSK
он должен быть статически слинкован. Что далеко не всегда тривиальная задача.
там в зависимости только несколько системных либ (ld-linux, linux-vdso, libpthread, libc). не уверен, что их статически возможно встроить. не знаю подробностей докера from scratch, но думаю он предоставляет какой-то базовый набор системных либ.
ergo ★★
( 26.01.23 16:48:06 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка
сформируй свое мнение потратив на каждый из языков по дню. какой покажется интересней, тот и бери. с точки зрения рынка они весьма похожи. с точки зрения перспективности — на мой взгляд го будет привлекательней. как тут уже писали, его производительность позволяет даже нубский говнокод в продакш закидывать ибо даже кривой-косой он будет летать быстрее, чем хорошо написанный код на питоне.
у меня в голове когда-то был питон. уже почти 10 лет как не пишу на нем. не особо скучаю. го в моих задачах несопоставимо выигрышнее в сравнении с питоном.
ergo ★★
( 26.01.23 16:53:36 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка
9 причин перейти с Python на Go

Переход на новый язык — это всегда большой шаг. Особенно, если этим языком владеет только один член команды. В начале этого года мы поменяли основной язык программирования в Stream — с Python на Go. В этой статье я приведу 9 причин почему — и 3 минуса, выявленных в процессе.
Причина 1. Производительность
Go — быстрый. Очень быстрый! По скорости его можно сравнить с Java или C++. В нашем сценарии использования Go обычно в 40 раз быстрее Python. Вот небольшая игра-бенчмарк, в которой сравниваются Go и Python.
Причина 2. Скорость языка имеет значение
Во многих приложениях язык программирования является лишь связующим звеном между самим приложением и базой данных. Скоростью самого языка обычно можно пренебречь. Однако наше приложение обеспечивает работу каналов и чат-платформы для 700 компаний и более 500 млн конечных пользователей. Несколько лет мы оптимизировали Cassandra, PostgreSQL, Redis и другие компоненты и, в конце концов, достигли пределов возможностей используемого языка. Python — прекрасный язык, но его скорости недостаточно для таких сценариев использования, как сериализация/десериализация, ранжирование и агрегирование. У нас часто возникали проблемы со скоростью: Cassandra извлекала данные за 1 мс, а Python тратил еще 10 мс, чтобы преобразовать их в объекты.
Причина 3. Продуктивность разработчиков и ограничение креативности
Взгляните на этот небольшой фрагмент кода на Go из руководства по началу работы с Go. (Это отличное руководство и хорошая отправная точка для знакомства с этим языком.)

Если вы новичок в Go, то вас вряд ли что-то удивит при чтении этого небольшого фрагмента кода. В нем показано несколько присвоений, структуры данных, указатели, форматирование и встроенная библиотека HTTP.
Когда я только начал программировать, я старался использовать более продвинутые возможности Python. Python позволяет подойти к написанию кода творчески. Например, вы можете:
- использовать метаклассы для самостоятельной регистрации классов при инициализации кода;
- заменять True на False и наоборот;
- добавлять функции в список встроенных функций;
- создавать перегрузку операторов с помощью магических методов;
- использовать функции в качестве свойств через декоратор @property.
С этими функциями интересно поэкспериментировать, но они зачастую усложняют понимание чужого кода (и со мной согласится большинство программистов). Go заставляет следовать основам. Это позволяет читать чужой код и сразу понимать, как что работает. Примечание. Разумеется, простота сильно зависит от вашего сценария использования. Если вы хотите создать базовый интерфейс CRUD API, я бы порекомендовал связку Django + DRF или Rails.
Причина 4. Параллелизм и каналы
Go пытается оставаться простым. Он не вводит множество новых концепций. Главное — создание понятного и невероятно быстрого языка, с которым легко работать. Единственная инновация в нем — это гоурутины и каналы. (Если быть на 100% точным, то концепция CSP появилась в 1977 году, поэтому данное нововведение — это скорее новый подход к хорошо забытому старому.)
Гоурутины (смотри тут) — это упрощенный подход Go к многопоточности. Создание гоурутин обходится очень дешево, а сами они занимают всего несколько килобайт дополнительной памяти. Из-за столь низких запросов их можно запускать сотнями или даже тысячами одновременно.
Для взаимодействия между гоурутинами можно использовать каналы. Все сложности берет на себя среда выполнения Go. Реализация многопоточности с ними позволяет легко использовать все доступные ядра ЦП и обрабатывать параллельный ввод-вывод данных без усложнения разработки. По сравнению с языками Python или Java запуск функции с помощью гоурутины требует минимального шаблонного кода. Вам нужно всего лишь добавить к вызову функции ключевое слово «go»:

С используемой в Go реализацией многопоточности очень легко работать. Это довольно интересный подход, учитывая, что в том же Node разработчику приходится внимательно следить за обработкой асинхронного кода.
Другим важным аспектом многопоточности в Go является детектор гонки (Go Race Detector). Он позволяет легко выявлять наличие гонки в асинхронном коде.

Вот несколько полезных ресурсов для знакомства с Go и каналами:
- https://gobyexample.com/channels
- https://tour.golang.org/concurrency/2
- http://guzalexander.com/2013/12/06/golang-channels-tutorial.html
- https://www.golang-book.com/books/intro/10
- https://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html
- Goroutines vs Green threads (Сравнение гоурутин и «зеленых» потоков)
Причина 5. Быстрая компиляция
На текущий момент компиляция нашего самого крупного микросервиса на Go занимает 4 секунды. Быстрая компиляция — главное преимущество Go перед медлительными Java и C++. Мне нравится сражаться на мечах, но еще приятнее, когда к завершению компиляции я ещё помню, что должен делать код:

Причина 6. Возможность собрать команду
Во-первых, начнем с очевидного: разработчиков на Go куда меньше, чем разработчиков на более старых языках типа C++ и Java. Согласно данным StackOverflow, 38% разработчиков знает Java, 19,3% — C++ и только 4,6% — Go. Данные GitHub показывают аналогичную тенденцию: язык Go встречается чаще, чем языки типа Erlang, Scala и Elixir, но не так популярен, как Java и C++. К счастью, Go легок и прост в изучении. Он предлагает только базовые необходимые функции и ничего более.
Среди новшеств — вводятся оператор defer и встроенное управление многопоточностью с помощью гоурутин и каналов. Для сторонников пуризма: Go не был первым языком, реализовавшим эти концепции, но именно в нем они приобрели популярность.
Благодаря простоте языка любой новоприбывший разработчик на Python, Elixir, C++, Scala или Java сможет влиться в процессы уже через месяц. Получается, собрать команду разработчиков на Go гораздо проще, чем на других языках. А это важное преимущество, если вы набираете сотрудников в таких конкурентных экосистемах, как Боудер и Амстердам.
Причина 7. Сильная экосистема
В нашей команде 20 человек, и для нас экосистема очень важна. Вы просто не сможете создавать добавленную стоимость для своих клиентов, если вам придется заново изобретать каждую маленькую функцию. В Go есть отличная поддержка инструментов, которыми мы пользуемся. Надежные библиотеки уже доступны для Redis, RabbitMQ, PostgreSQL, разбора шаблонов, планирования задач, разбора выражений и RocksDB.
Безусловно, экосистема Go уступает Java, Python или Node, но она с большим отрывом выигрывает у языков поновее, типа Rust или Elixir. Это крепкая экосистема с готовыми высококачественными пакетами под многие базовые задачи.
Причина 8. Gofmt, принудительное форматирование кода
Начнем с того, что такое Gofmt. И нет, это не ругательство. Gofmt — это потрясающая утилита командной строки, встроенная в компилятор Go и предназначенная для форматирования кода. По функциональности она очень похожа на autopep8 в Python. И что бы ни показывали в «Кремниевой долине», большинству из нас не очень интересно спорить о табуляциях и пробелах. Главное, чтобы форматирование было единообразным, но каким оно будет конкретно, особо не важно. Gofmt избавляет от подобных споров, предлагая один официальный способ форматирования кода.
Причина 9. gRPC и буферы протокола
У Go первоклассная поддержка буферов протоколов и gRPC. Они прекрасно работают в тандеме при создании микросервисов, взаимодействующих через RPC. Вам нужно только написать манифест, где будут установлены допустимые вызовы RPC и принимаемые ими аргументы. Затем из этого манифеста автоматически генерируется серверный и клиентский код.
Получившийся код будет быстрым и простым в использовании, а еще он практически не нагрузит сеть. Один и тот же манифест позволяет сгенерировать клиентский код на самых разных языках, даже на C++, Java, Python и Ruby. Так что больше никаких неоднозначных конечных точек REST для внутреннего трафика, для которых каждый раз приходится писать практически один и тот же клиентский и серверный код.
Недостаток 1. Отсутствие фреймворков
У Ruby есть Rails, у Python — Django, у PHP — Laravel. А вот у Go нет ни одного ведущего фреймворка. По этой теме в сообществе постоянно ведутся жаркие дебаты. Многие считают, что никакие фреймворки языку в принципе не нужны. Я частично соглашусь, в некоторых сценариях они не потребуются. Но если кто-то захочет создать простой интерфейс CRUD API, ему будет гораздо проще с Django/DJRF, Rails, Laravel или Phoenix.
Дополнение. Комментаторы указали несколько проектов, которые предлагают фреймворк для Go — Revel, Iris, Echo, Macaron и Buffalo. Мы для своих сценариев предпочли не использовать фреймворк. Однако для многих новых проектов, нацеленных запилить простой интерфейс CRUD API, отсутствие ведущего фреймворка станет серьезным недостатком.
Недостаток 2. Обработка ошибок
При возникновении ошибки Go просто возвращает эту ошибку функции и ожидает, что ее обработает вызывающий код — либо вернет ее выше, в стек вызывающей программы. Такой подход вполне работоспособен, но можно легко упустить из виду, что что-то пошло не так, и не выдать пользователям соответствующее сообщение об ошибке.
Пакет errors решает эту проблему, позволяя добавлять контекст и выполнять трассировку стека до ваших ошибок. Другая проблема заключается в том, что можно случайно забыть обработать ошибку. Да, в этом случае помогут инструменты статического анализа типа errcheck и megacheck. Эти обходные решения прекрасно работают, но все же прибегать к ним как-то неправильно. Хочется, чтобы язык поддерживал надлежащую обработку ошибок.
Недостаток 3. Управление пакетами
Управление пакетами в Go оставляет желать лучшего. По умолчанию в нем нельзя указывать конкретную версию зависимости и создавать воспроизводимые сборки. У Python, Node и Ruby с этим получше. Впрочем, при использовании подходящих инструментов можно наловчиться управлять пакетами и в Go. Для указания и закрепления версий подходит Dep. Кроме того, мы участвовали в разработке VirtualGo — он упрощает работу над несколькими проектами параллельно.
Дополнение. С момента публикации статьи механизм управления пакетами в Go поменялся в лучшую сторону. Эффективным решением стали модули Go. Единственной проблемой, с которой я столкнулся — они ломают некоторые инструменты статического анализа, такие как errcheck. Вот руководство по использованию Go и модулей Go.
Сравниваем Python и Go
Мы провели интересный эксперимент, взяв функционал нашего ранжирования каналов на Python и переписав его на Go. Взгляните на этот пример метода ранжирования:

Для его поддержки код как на Python, так и на Go должен выполнить следующее:
- Разобрать выражение для оценки. В данном случае мы хотим превратить строку «simple_gauss(time)*popularity» в функцию, которая на входе принимает активность, а на выходе возвращает оценку (score).
- Создать частично вычисляемые функции на основе конфигурации JSON. Например, нам нужно, чтобы функция simple_gauss вызывала decay_gauss со шкалой (scale) в 5 дней, смещением (offset) в 1 день и коэффициентом затухания (decay) 0,3.
- Разобрать конфигурацию по умолчанию (defaults), чтобы у вас была возможность перейти в резервный режим работы, если какое-либо поле в активности окажется не определено.
- Использовать функцию из шага 1 для оценки всех активностей на канале.
Разработка кода ранжирования на Python заняла примерно 3 дня. Сюда входит написание кода, модульных тестов и документации. Затем мы потратили примерно 2 недели на оптимизацию кода. Одна из оптимизаций состояла в переводе выражения оценки (simple_gauss(time)*popularity) в абстрактное синтаксическое дерево. Мы также реализовали логику кэширования, которая предварительно вычисляла оценку для определенного времени в будущем.
Написание этого же кода на Go заняло примерно 4 дня. Дополнительные оптимизации не потребовались. Хотя поначалу разработка на Python шла быстрее, с Go было гораздо меньше возни. Плюсом с Go мы получили более высокую скорость работы кода — в 40 раз быстрее, чем высокооптимизированный код на Python.
Это лишь один из примеров буста производительности, который мы получили при переходе на Go. Ну и, конечно же, сравнение несопоставимого:
- код ранжирования был моим первым проектом на Go;
- на Go мы писали уже после того, как написали код на Python, поэтому я лучше понимал сценарий использования;
- библиотека Go для разбора выражений была исключительно высокого качества.
Может, у вас было по-другому. Стоит признаться, что какие-то другие компоненты системы на Go разрабатывались гораздо дольше, чем на Python. В целом разработка на Go требует чуть больше усилий, но зато на оптимизацию уходит гораздо меньше времени.
Дополнение. С момента публикации статьи разница в производительности Python и Go возросла. Go стал ещё быстрее, а Python — нет.
Сравнение Elixir и Go. Серебряный призер
Еще мы рассматривали Elixir. Он построен на виртуальной машине Erlang. Один наш коллега с ним долго работал, и мы решили его проверить. В наших сценариях использования мы заметили, что исходная скорость Go намного выше. И Go, и Elixir отлично справляются с тысячами параллельных запросов, но если оценивать скорость отдельных запросов, то Go гораздо быстрее.
Другой причиной стала экосистема. Для Go уже были готовы проверенные библиотеки для нужных нам компонентов, тогда как библиотеки Elixir было невозможно использовать в рабочей среде без предварительной подготовки. Кроме того, найти или обучить разработчиков на Elixir сложнее. В общем, наши взоры вновь устремились на Go. Но если вы захотите его опробовать, обратите внимание на потрясающий фреймворк Phoenix — он определенно заслуживает внимания.
Заключение
Go — высокопроизводительный язык с отличной поддержкой многопоточности. Он практически такой же быстрый, как C++ и Java. Хотя разработка на Go занимает больше времени, чем разработка на Python или Ruby, вы сэкономите массу времени на оптимизации кода.
У нас небольшая команда разработчиков поддерживает работу каналов и чата для более чем 500 млн конечных пользователей. Благодаря сочетанию отличной экосистемы, простоты адаптации новых разработчиков, высокой производительности, хорошей поддержки многопоточности и продуктивной среды разработки язык Go стал отличным вариантом. Мы по-прежнему используем Python в Stream для информационного табло, сайта и машинного обучения для персонализированных каналов, и прощаться с ним не планируем. Но теперь весь высокопроизводительный код будет писаться на Go. Наш новый Chat API также полностью написан на Go. Если вы хотите узнать больше о языке Go, ознакомьтесь со статьями из списка ниже.
Остаётесь верны Python? Напишите нам — мы подберём для вас что-нибудь подходящее. Сейчас нам очень нужны Python-разработчики для работы удалённо или с релокацией. Если вы ищете разработчиков, тоже пишите. 🙂
Дополнительные материалы по переходу на Golang
- https://movio.co/en/blog/migrate-Scala-to-Go/
- https://hackernoon.com/why-i-love-golang-90085898b4f7
- https://sendgrid.com/blog/convince-company-go-golang/
- https://dave.cheney.net/2017/03/20/why-go
Изучение Go
- https://learnxinyminutes.com/docs/go/
- https://tour.golang.org/
- http://howistart.org/posts/go/1/
- https://getstream.io/blog/building-a-performant-api-using-go-and-cassandra/
- https://www.amazon.com/gp/product/0134190440
- Go Rocket Tutorial (Руководство по работе с Go)
- Как удаленная работа может изменить будущее детей
- Как вырастить рекрутёра с нуля и зачем брать в команду новичков
- Как мигрировать компанией за неделю и никого не потерять. История Monite
