Что написано на golang
5 самых известных проектов, написанных на Golang
О языке программирования Golang, созданном корпорацией Google, на Хабре рассказывали много и подробно, так что мы не будем в очередной раз обсуждать достоинства этого инструмента. Лучше поговорим об известных проектах, которые написаны на Go — они являются доказательством если не универсальности, то разносторонности языка и его возможностей.
Кроме того, упомянем и самые известные компании, которые работают с Go. Кто знает, возможно, кто-то из читателей Хабра там уже работает, и сможет рассказать подробности. Как всегда, все самое интересное — под катом. Статья написана совместно с Никитой Кузнецовым, старшим разработчиком в компании Мегафон и преподавателем курса “Go-разработчик PRO” в Skillbox.
Docker
Это один из наиболее известных и сложных продуктов, написанных на Go. Менее чем за год эта система для запуска изолированных виртуальных машин с кастомизируемой средой стала чрезвычайно популярной.
Команда Docker решила взять на вооружение Go по нескольким причинам:
Kubernetes
Если говорить о Docker, то невозможно не упомянуть и другой, тесно связанный с ним проект — Kubernetes. Он тоже написан на Golang, причем его писали, фактически, создатели этого языка — разработчики из Google. Вместе с ними над Kubernetes работали представители других крупных компаний, включая IBM и Microsoft.
Перед тем, как приступить к созданию Kubernetes, разработчики из Google рассматривали возможность использования других языков, а именно C / C ++, Java и Python.
Золотой серединой в итоге стал именно Go, о чем рассказал Джо Беда, соучредитель и экс-технический руководитель проекта. Сейчас он работает в команде Vmware.
CoreOS
Конечно, нельзя сказать, чтобы вся эта ОС с открытым исходным кодом на базе ядра Linux была написана на Golang. Но основные компоненты этой системы — да, написаны. Предназначена ОС для создания инфраструктуры компьютерных кластеров, причем особое внимание уделено автоматизации, упрощению внедрения приложений, безопасности, надежности.
CoreOS предоставляет возможности для развертывания приложений внутри программных контейнеров, плюс средства обнаружения и передачи настроек.
Так вот, на Golang написаны оба демона этой ОС: etcd и fleet. Fleet позволяет обращаться с кластером CoreOS так, как если бы он имел общую систему инициализации. А etcd представляет собой распределенное хранилище ключей и значений, а также обеспечивает синхронизацию настроек между приложениями Docker и экземплярами CoreOS. Распространяются они под открытой лицензией Apache License 2.0. На Go их написали потому, что язык «предоставляет отличную кроссплатформенную поддержку, обширную экосистему и сообщество».
Istio
Это — отличная open-source технология от IBM, которая позволяет разработчикам подключать и управлять целыми сетями микросервисов. Также разработчики могут обеспечивать безопасность этих микросервисов вне всякой зависимости от платформы, источника или производителя. По словам команды, Istio — один из самых быстро развивающихся проектов с открытым исходным кодом. Его главная движущая сила — сообщество и участники Github.
Важно отметить, что Istio — часть экосистемы Kubernetes. При помощи этого инструмента разработчики могут не только соединять сервисы друг с другом, но и давать им доступ во внешний мир. При помощи Istio разработчики получают программируемую сервисную сетку, сетевые прокси между каждым контейнером в кластере Kubernetes и внешним миром.
Golang выбрали потому, что с его помощью можно создавать децентрализованные распределенные сетевые проекты, чем и является Istio.
Traefik
Это еще один сетевой проект, написанный на Go. Он представляет собой обратный прокси-сервер и балансировщик нагрузки для сетевых сервисов. Инструмент создавался для работы с широким спектром вариантов оркестровки, от Kubernetes и Docker Swarm до Amazon ECS и Azure Service Fabric. Traefik автоматически создает маршруты, необходимые микросервисам, работающим под управлением этих оркестраторов, для связи с внешним миром. Он также генерирует данные трассировки и статистику, подходящие для вашего оркестратора.
Вот основные возможности обратного прокси-сервера:
Зачем вам учить Go
Источник картинки
Go — относительно молодой, но популярный язык программирования. По данным опроса Stack Overflow, именно Golang получил третье место в рейтинге языков программирования, которые хотели бы освоить разработчики. В этой статье мы попробуем разобраться в причинах популярности Go, а также посмотрим, где этот язык используется и почему его вообще стоит изучать.
Немного истории
Язык программирования Go был создан компанией Google. Собственно, его полное название Golang — производное от «Google language». Несмотря на то, что в анонсе язык был назван молодым, в этом году ему исполняется уже десять лет.
Цель, которая стояла перед создателями Go — разработать простой и эффективный язык программирования, который мог бы использоваться для создания качественного программного обеспечения. Роб Пайк, один из создателей Go, заявил, что Go разрабатывался для программистов компании, которые относительно недавно закончили учиться и знают Java, C, C++ или Python. Go для них — язык, в котором можно быстро разобраться и к которому быстро привыкаешь.
Изначально он был инструментом внутри Google, но с течением времени вышел из недр корпорации и стал достоянием общественности.
Преимущества языка
У Golang есть большое количество плюсов, как известных, так и не очень.
Простота. Собственно, это была основная цель создания языка, и ее удалось достичь. У Go достаточно простой синтаксис (с определенными допущениями), поэтому приложения можно разрабатывать быстрее, чем на некоторых других языках. И здесь есть два интересных момента.
Во-первых, Golang достаточно быстро может изучить полный новичок в программировании — тот, кто не знает вообще ни одного языка и только собирается стать разработчиком. О Go можно сказать, что он почти такой же несложный (относительно, конечно), как PHP или даже Pascal, но такой же мощный, как С++.
Во-вторых, Go может освоить уже «сформировавшийся программист», тот, кто уже знает один или несколько языков. Чаще всего разработчики изучают Go после того, как освоили Python или PHP. Далее некоторые программисты с успехом используют пару Python/Go или PHP/Go.
Большое количество библиотек. Если вам не хватает какой-либо возможности в Go, можно воспользоваться одной из множества библиотек и выполнить требуемую задачу. У Go есть еще одно преимущество — можно без проблем взаимодействовать с библиотеками языка Си. Есть даже мнение, что Go-библиотеки — это обертки для C-библиотек.
Чистота кода. Компилятор Go позволяет держать код «чистым». К примеру, неиспользуемые переменные считаются ошибкой компиляции. В Go решается большая часть проблем форматирования. Это делается, к примеру, при помощи программы gofmt при сохранении или компиляции. Форматирование правится автоматически. Подробнее обо всем этом можно узнать в туториале Effective.
Статическая типизация. Еще одно преимущество Go, благодаря которому снижается вероятность допущения ошибки разработчиком. Да, первые пару дней программист, привыкший к динамической типизации, раздражается при необходимости объявлять тип для каждой переменной и функции, равно, как и для всего остального. Но потом становится понятно, что здесь сплошные плюсы.
GoDoc. Утилита, которая очень сильно упрощает документирование кода. Большим плюсом GoDoc является то, что здесь не используются дополнительные языки вроде JavaDoc, PHPDoc или JSDoc. Утилита использует максимальное количество информации, которую она извлекает из документируемого кода.
Обслуживание кода. Его легко обслуживать именно благодаря простому и лаконичному синтаксису. Все это — наследие Google. Поскольку у корпорации огромное количество кода для различных программных продуктов, а также десятки тысяч разработчиков, которые все это разбирают, то появляется проблема обслуживания. Код должен быть понятен всем, кто над ним работает, хорошо документированным и лаконичным. Все это возможно с Go.
При этом в Golang нет классов (есть структуры, struct), нет поддержки наследования, что значительно упрощает изменение кода. Плюс нет исключений, аннотаций и т.п.
Что можно написать на Go
Практически все, за исключением некоторых моментов (например, разработки, связанные с машинным обучением — здесь больше подходит все же Python с низкоуровневыми оптимизациями на C/C++ и CUDA).
Все остальное можно писать, особенно это актуально в отношении web-сервисов. Кроме того, на Go стоит разрабатывать приложения как для конечного пользователя, так и для разработки демонов, UI, он подходит для кроссплатформенных приложений и сервисов.
Востребованность Golang
С течением времени язык становится все более востребованным. Кроме тех компаний, что присутствуют на картинке выше, с Golang работают Mail.ru Group, Avito, Ozon, Lamoda, BBC, Canonical и другие.
«Мы решили масштабировать бизнес, нам важно построить принципиально новую технологическую платформу, которая обеспечит быстрое развитие продукта. Делаем ставку на Go из-за его скорости и надёжности, а главное — аудитории программистов, которая его использует», — заявили представители Ozon в 2018 году, после того как компания приняла решение перейти на Golang.
Ну а что насчет доходов заработная плата Go-разработчика в прошлом году составила в среднем 60-140 тыс. рублей по данным «Моего Круга». По сравнению с 2017 годом этот показатель увеличился на 8,3%. В 2019 году, скорее всего, рост продолжится, поскольку разработчики Golang нужны очень многим компаниям.
Что дальше?
Останавливаться в развитии Golang точно не будет. Потребность в хороших специалистах, которые знают этот язык, будет только возрастать, так что работу специалисту (начинающему или профи) найти будет несложно. В принципе, это утверждение актуально и сейчас, поскольку на рынке IT наблюдается постоянный дефицит разработчиков.
Go хорош как для начинающих программистов, так и для профи, кто уже знает один или несколько языков программирования. Выучить его или переучиться может практически любой программист.
Статья готовилась совместно с преподавателем курса Golang в GeekBrains Сергеем Кручининым, за что ему огромное спасибо!
Язык Go: что под капотом и зачем программисту учить его как второй
В 2009 году в Google создали новый язык программирования. Разбираемся, почему без этого было не обойтись и за что программисты любят Go.
Go или Golang — язык, который разработали в Google Роб Пайк и Кен Томпсон, в прошлом сотрудники легендарной Bell Labs. Оба — культовые личности в Computer Science. А Томпсон к тому же один из создателей ОС Unix и языка B (предшественника C).
Фанат Free Software Foundation, использует Linux и недолюбливает Windows. Пишет истории про кодинг и программы на Python. Влюблен в LISP, но пока что не умеет на нем программировать.
Ну здравствуй, Go: пишем нашу первую программу
По традиции это, конечно, « Hello, World!». В комментариях — разбор синтаксиса:
Какие типы данных есть в Go
Go — язык со строгой статической типизацией, то есть каждая переменная имеет свой тип и менять его нельзя. Сравним с PHP:
В примере мы изменили тип данных на лету и даже провели математические операции над строкой и целым числом. В языке Go это невозможно — если переменная объявлена как целое число, такой она и останется на протяжении всей программы, можно менять только её значение. А если попытаемся положить в неё данные другого типа — модуль проверки Go подскажет, что у нас ошибка.
В языке есть 11 типов целых чисел. Они различаются количеством бит, спецификой (например, есть отдельный тип byte для двоичных чисел) и контекстом (например, uintptr для работы с внешним кодом). Кроме того, есть числа с плавающей точкой, комплексные числа, булевы числа, строки и три типа чисел с неограниченной точностью, которые могут принимать любое значение и ограничены только объёмом памяти компьютера.
Переменные в Go объявляются в стиле Паскаля — через оператор var, а само объявление можно совмещать с присваиванием:
Оператор присваивания в Go — знак «равно»:
Параллелизм в Go: горутины, каналы и функциональность
Ещё одно важное свойство Go — многопоточность. Тут придётся немного погрузиться в историю компьютерных технологий.
В 1965 году Гордон Мур, основатель Intel, сформулировал закон: каждые два года количество транзисторов на интегральной схеме будет удваиваться. Никаких научных данных или формул за ним нет — просто наблюдение. И до XXI века «закон Мура» работал исправно. Но примерно после Pentium 4 стало понятно: ещё немного, и процессоры будут нагреваться как сверхновая. Тогда производители начали делать многоядерные процессоры — тактовая частота и количество транзисторов почти не менялись, а суммарное быстродействие росло.
Чтобы использовать все возможности таких процессоров, программы надо сразу писать с расчётом на многоядерность. В Go для этого есть специальные сущности: горутины и каналы.
Горутины
Это функции, которые могут работать параллельно, то есть программа выполняет несколько строк практически одновременно. Чтобы сделать из функции горутину, надо просто написать перед ней go.
Вот как это выглядит:
Результат — практически одновременный вызов, несмотря на задержку time. Sleep (10), обеих горутин. Конечно, в небольшой программе это делать практически бессмысленно, а вот при вызове множества функций — очень даже оправдано. Экономится время и ресурсы процессора используются равномерно.
За выполнением горутин в Go следит специальная библиотека времени исполнения: она распределяет между ними ядра процессора, может ограничивать число доступных ядер. Библиотека помогает запускать огромное количество горутин — намного больше, чем позволяет операционная система, — и не требует от программиста заниматься распараллеливанием вручную.
Каналы
Это что-то вроде общего хранилища данных. Каналы передаются как аргументы горутин и помогают им общаться между собой и обмениваться данными. В каналах есть очередь и блокировка — чтобы разные горутины не смогли одновременно закинуть туда разные данные. Особенность каналов: они позволяют записывать и считывать только один тип данных. Например, int — целые числа.
Немного похоже на работу с переменными — используем оператор присваивания и сразу задаём тип данных. Но интересно, что значением канала будет его адрес в памяти (вывод второго оператора Printf).
Теперь объединим горутины и канал:
А сейчас следите за руками — будем разбирать код:
В многопоточность отлично вписывается функциональная парадигма программирования, и язык Go во многом поддерживает её. В нём, конечно, присутствуют императивные конструкции, элементы ООП и всё такое. Но именно ярко выраженная функциональная парадигма делает Golang мощным инструментом для высоконагруженных серверных решений, сервисов и сложных вычислений.
Что ещё есть в Go: возможности для программистов
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.
Этот язык уже несколько лет в поле видимости.
5 ответов 5
И что можно написать?
Что угодно. На самом деле что угодно, но, в силу своих плюсов он очень популярен для разработки сервер-сайда (бэкенда).
Вопрос риторический. С точки зрения покупаемости, готовый спрос на него почти отсутствует, в силу молодости и нераскрученности. Так что смысл в нём есть:
Плюсы или «почему я выбрал Go»
Производительность
По производительности для веб (готовые фреймворки) Go проигрывает только Java и С/С++ и наравне с node.js. При этом потребление ресурсов существенно ниже, чем у Java и производительность намного больше, чем у Python/Ruby.
Многопоточность
При этом имеет просто офигенную многопоточную модель по сравнению с ними. Пока это лучшее, что я встречал для многопточки/асинхрона. При этом он поддерживает и классические паттерны вроде мьютексов и колбэков.
Простота
Он очень прост в освоении. Мне кажется даже элементарен, особенно если есть основа из Python/JavaScript. Есть также довольно занятная модель наследования, которая, как мне кажется более прозрачна чем классическое ООП, но немного непривычна поначалу.
Надёжность
Язык этот компилируемый и статически типизированный. Что даёт выявление многих ошибок задолго до продакшена. К примеру такие ошибки в Python выявляются только непосредственным тестированием и, если тестов нет, то шансов положить систему очень много. Тут же это исключается на этапе компиляции.
Скорость компиляции
И, наконец, одна из главнейших фишек — не стоит бояться типизации и компиляции. В 145% случаев Вам не придётся объявлять тип переменой в коде — он задаётся автоматически при присвоении ей значения. Объявлять переменные заранее также не нужно.
Итого
Т.е. мы имеем плюсы из двух миров — скорость компиляции/запуска интерпретируемого и надёжность компилируемого языков. Плюc сверху производительность, мультипарадигменность (можно писать в функциональном стиле), простота и низкое ресурсопотребление.
Чем хорош язык Go и зачем его изучать? Все плюшки Golang
Язык Go – серверный язык будущего. В этой статье мы не будем разбирать «Hello World!», но затронем важность Golang и его характеристики.
Аппаратные ограничения
Первый процессор Pentium 4 с тактовой частотой 3,0 ГГц был представлен еще в 2004 году корпорацией Intel. Сегодня Mackbook Pro 2016 имеет тактовую частоту 2,9 ГГц. Таким образом, почти за одно десятилетие мощности не слишком-то изменились. Вы можете увидеть сравнение мощностей на разных этапах на диаграмме ниже.
Из приведенной диаграммы видно, что производительность потока и частота процессора оставались стабильными почти десятилетие. Если вы думаете, что добавление большего количества транзисторов окажется хорошим решением – вы ошибаетесь. Это связано с тем, что начнут проявляться некоторые квантовые свойства (например, туннелирование) и сопутствующие проблемы.
Для решения этой задачи:
Но у вышеупомянутых решений тоже есть недостатки. Мы не можем добавить к процессору неограниченное количество кэш-памяти, поскольку у нее есть физические ограничения: чем больше кэш, тем он медленнее. Да и добавление большего количества ядер в процессор повлечет дополнительные затраты.
Все это имеет пределы. Например, многоядерные процессоры могут одновременно запускать несколько потоков, что приводит к параллелизму изображения.
Если же нельзя положиться на усовершенствование оборудования, единственный выход – более эффективное ПО для повышения производительности. Но современные языки программирования малоэффективны в данном вопросе.
«Современные процессоры похожи на нитрозаправленные смешные автомобили. К сожалению, языки программирования сегодня напоминают Монте-Карло: они полны изгибов и поворотов.» © D. Ungar
У нас есть язык Go и горутины!
Увеличение количества ядер ожидается и в дальнейшем. Более того, сегодняшние приложения используют несколько микросервисов для поддержки соединений с базами данных, MQ (Messages queues) и хранение кэша. Разрабатываемое нами ПО и языки программирования должны поддерживать параллелизм и быть расширяемыми в условиях постоянного увеличения количества ядер.
Большинство современных языков программирования (таких как Java, Python etc.) поддерживают многопоточность. Но настоящая проблема связана с одновременным исполнением, блокировкой потоков, состоянием гонки и взаимоблокировками. Это затрудняет разработку многопоточного приложения.
Возьмем, к примеру, Java. Каждый канал потребляет около 1 Мб объема памяти, и, в конце концов, если вы задействуете тысячи потоков, все может закончиться нехваткой памяти. Кроме того, взаимодействие между двумя или несколькими потоками – это тоже непросто.
Язык Go (он же Golang) появился в 2009 году, когда уже были многоядерные процессоры. Вот почему этот ЯП построен с учетом параллелизма. У Go есть goroutine вместо потоков. Они потребляют только 2 Кб памяти. Таким образом, можно в любой момент активировать миллионы горутин.
Вот одно из выступлений Роба Пайка, в котором раскрываются вопросы многозадачности и параллелизма.
Все вышеперечисленные моменты делают язык Go мощным инструментом в обработке параллелизма, как в C-языках и Java, но с сохранением естественности и красоты кода, как в Erlang.
Go запускается на базовом оборудовании
Одним из наиболее значительных преимуществ языков C и C++ над другими современными языками, такими как Java/Python, является их производительность. Дело в том, что C и C++ вместо интерпретации компилируются.
Процессоры считывают двоичный код. При создании программы на Java или других языках на базе JVM проект компилируется с понятного человеку кода в байтовый код для виртуальной машины поверх базовой ОС. Во время выполнения VM интерпретирует эти байт-коды и преобразует их в двоичные, которые могут понять процессоры.
В то время как есть языки C/C++, не использующие VM, из-за чего удаляется один шаг из цикла выполнения, что и повышает производительность. Код напрямую компилируется из человечески читаемого кода в двоичный.
Но освобождение и распределение переменной на таких ЯП – большая проблема. Хотя большинство языков обрабатывают распределение и удаление объектов с использованием сборки мусора или алгоритмов подсчета ссылок.
Язык Go собрал в себе лучшее из всего. Как и языки нижнего уровня, Go является компилируемым. Это означает, что производительность почти такая же высокая, как и в низкоуровневых языках. А еще он использует сборщик мусора для выделения и удаления объекта. Больше free() и malloc(). То, что нужно!
Код на Go прост в обслуживании
Язык Go лишен сумасшедшего синтаксиса. В отличие от других ЯП, в нем предусмотрен очень аккуратный и чистый синтаксис.
Разработчики Go это учли, создавая свой язык. Поскольку у Google очень большая код-база, над которой работают тысячи разрабов корпорации, код должен быть максимально прост для понимания всех остальных, и каждый его сегмент должен обладать минимальным количеством побочных эффектов для остальных частей. Такой код легко поддерживается и модифицируется.
Go специально не учитывает многие особенности современных языков ООП:
Вышеизложенные изменения делают Golang отличным от других языком, а программирование на Go – предельно простым. Возможно, некоторые перечисленные пункты вам и не понравятся (особенно если вы привыкли работать с типичными языками ООП).
Но это не значит, что вы не сможете написать свою программу на Go. Все, что нужно сделать, так это добавить дополнительные 2-3 строки кода. Зато на выходе код будет более красивым, чистым и понятным.
На графике видно, что язык Go примерно так же эффективен, как C/C++, и при этом сохраняет синтаксис кода простым, как Ruby или Python. Это лучший вариант для людей и процессоров.
В отличие от прочих новых языков, таких как Swift, синтаксис Go стабилен. Он остался прежним с первого выпуска версии 1.0, что состоялся в 2012 году. Это делает его обратно совместимым.
Golang поддерживается Google
Да, это не является прямым техническим преимуществом. Но Go создан и поддерживается успешной корпорацией. Google обладает одной из крупнейших облачных инфраструктур в мире, которая продолжает развиваться.
Язык программирования Go создан разработчиками Google для решения своих нужд, касающихся поддержки эффективности и масштабируемости. Это те же проблемы, с которыми вы тоже столкнетесь при создании собственных серверов.
Кроме того, язык программирования Go пользуется популярностью в компаниях IBM, Intel, Adobe, Medium и BBC.
Выводы
Несмотря на то, что язык Go сильно отличается от других объектно-ориентированных языков, это все тот же язык программирования. Go обеспечивает:
Даже если вы не планируете осваивать язык Go, вы все равно должны понимать, что аппаратный лимит оказывает на нас, разработчиков, сильное давление, так как далеко не всегда позволяет написать эффективный код. Разработчику необходимо понять аппаратное обеспечение и уже в соответствии с ним оптимизировать программу.
Доказано, что оптимизированное программное обеспечение может работать и на дешевом, медленном железе (например, на устройствах IOT), что оказывает положительный эффект на взаимодействие с конечным пользователем.