Что написать на 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 и зачем его изучать? Все плюшки 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), что оказывает положительный эффект на взаимодействие с конечным пользователем.
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.
Этот язык уже несколько лет в поле видимости.
5 ответов 5
И что можно написать?
Что угодно. На самом деле что угодно, но, в силу своих плюсов он очень популярен для разработки сервер-сайда (бэкенда).
Вопрос риторический. С точки зрения покупаемости, готовый спрос на него почти отсутствует, в силу молодости и нераскрученности. Так что смысл в нём есть:
Плюсы или «почему я выбрал Go»
Производительность
По производительности для веб (готовые фреймворки) Go проигрывает только Java и С/С++ и наравне с node.js. При этом потребление ресурсов существенно ниже, чем у Java и производительность намного больше, чем у Python/Ruby.
Многопоточность
При этом имеет просто офигенную многопоточную модель по сравнению с ними. Пока это лучшее, что я встречал для многопточки/асинхрона. При этом он поддерживает и классические паттерны вроде мьютексов и колбэков.
Простота
Он очень прост в освоении. Мне кажется даже элементарен, особенно если есть основа из Python/JavaScript. Есть также довольно занятная модель наследования, которая, как мне кажется более прозрачна чем классическое ООП, но немного непривычна поначалу.
Надёжность
Язык этот компилируемый и статически типизированный. Что даёт выявление многих ошибок задолго до продакшена. К примеру такие ошибки в Python выявляются только непосредственным тестированием и, если тестов нет, то шансов положить систему очень много. Тут же это исключается на этапе компиляции.
Скорость компиляции
И, наконец, одна из главнейших фишек — не стоит бояться типизации и компиляции. В 145% случаев Вам не придётся объявлять тип переменой в коде — он задаётся автоматически при присвоении ей значения. Объявлять переменные заранее также не нужно.
Итого
Т.е. мы имеем плюсы из двух миров — скорость компиляции/запуска интерпретируемого и надёжность компилируемого языков. Плюc сверху производительность, мультипарадигменность (можно писать в функциональном стиле), простота и низкое ресурсопотребление.
Если вы подумываете начать писать на Go, то вот что вам следует знать
Ваш любимый питомец пишет на Go и получает больше вас, а вы ещё нет? Не теряйте времени… Такая мысль может родиться у читателя от обилия статей по Go. Некоторым даже компании предлагают переучиться на этот язык. И, если вы хоть раз задумывались освоить язык, то я хочу вас предостеречь. Вернее показать странные вещи, попробовать объяснить зачем они и потом вы уже сами сделаете вывод нужен ли вам Go.
Для кого эта статья
Статья в первую очередь предназначена тем людям, для которых важна выразительность языка. И одновременно для тех, кто хочет пощупать Go.
Я сам Си++/Python разработчик и могу сказать, что это сочетание является один из оптимальнейших для освоения Go. И вот почему:
Что по-поводу пары Java/C#? Go ей ни разу не конкурент, по крайней мере пока он молод (речь про версию Go 1.11).
Чего не будет в статье
А что будет? Только конкретные случаи дискомфорта, которые доставляет язык в работе.
Начало работы
Хорошим вводным по языку мануалом является короткая онлайн книга Введение в программирование на Go. Читая которую вы довольно быстро наткнётесь на странные особенности. Приведём для начала первую партию из них:
Странности компилятора
Поддерживаются только египетские скобки, то есть следующий код не компилируется:
Авторы считают, что стиль программирования должен быть единообразным и компактным. Чтож хозяин — барин.
Здесь упор идёт на то, что почти всегда это ошибка, связанная или с опечаткой, или спешкой, или кривым рефакторингом. Как бы в конечном коде да, такого быть не должно. Но мы редко пишем сразу конечный код и периодически пробуем запускать промежуточные версии, в которых может быть некоторый задел на будущее. Поэтому данное поведение компилятора напрягает.
Правда со временем возникает множество ситуаций, когда это уберегло от ошибки. Но это всё-равно напрягает.
Неиспользуемые параметры приходится заглушать и это смотрится странно, хотя в питоне так тоже можно:
Но это всё цветочки и даже просто вкусовщина разработчиков. Теперь перейдём к более тяжеловесным вещам.
«Безопасный» язык
И тут надо не забыть сказать об очень важной вещи. Дело в том, что язык сделан именно таким, чтобы неопытным разработчики не имели возможности создавать плохие программы.
Вот цитата одного из создателей языка:
«Ключевой момент здесь, что наши программисты (прим.пер.: гуглеры) не исследователи. Они, как правило, весьма молоды, идут к нам после учебы, возможно изучали Java, или C/C++, или Python. Они не в состоянии понять выдающийся язык, но в то же время мы хотим, чтобы они создавали хорошее ПО. Именно поэтому язык должен быть прост для понимания и изучения.»
Так значит вы говорите безопасный язык?
и после запуска программы получаем:
В этом невинном примере мы «забыли» выделить себе память и получили ошибку времени выполнения. Так а какой безопасности может идти речь, если вы меня не спасли от неверной ручной работы по выделению ресурсов?
Хабраюзер tyderh замечает, что:
Безопасность заключается в том, что при выполнении отлавливается ошибка, а не происходит неопределённое поведение, способное произвольным образом изменить ход выполнения программы. Таким образом, подобные ошибки программистов не способны привести к появлению уязвимостей.
Вызовет ошибку компиляции, что как бы нормально. Но поскольку в Go пока (пока!) нет шаблонов, то очень часто они эмулируются через интерфейсы, что может рано или поздно вылиться в такой код:
Этот код уже компилируется и работает, но не так как ожидает программист. Все три сравнения выдадут false, ибо сначала сравнивается тип интерфейсов, а он разный. И если в данном случае ошибка явно бросается в глаза, в реальности она может быть сильно размыта.
powerman поделился ещё один примером ложных ожиданий:
Интерфейс с nil не равен просто nil, будьте осторожны. В FAQ языка этот момент есть.
Ну и завершая про безопасность. Разыменование в языке убрано, а вот спецэффекты в зависимости от вида доступа от доступа (по указателю или по копии) остались. Поэтому следующий код:
Выведет pen. А следующий:
Выведет «-deleted-«, но пожалуйста, не ругайте сильно программистов, когда они на эти грабли наступят, от этого в «безопасном» языке их не спасли.
а потом вы решили добавить второй параметр возврата, IDE подсказал вам, что теперь надо его ловить, и вам пришлось попутно заменить оператор и вдруг вы видите грабли перед лицом.
А это значит, что теперь нам надо у PVS просить статический анализатор для языка Go.
Краткий вывод: безопасность присутствует, но она не абсолютна от всего.
«Единообразный» язык
Выше в разделе странности компилятора было указано, что при неверном форматировании кода, компилятор упадёт. Я предположил, что это было сделано для единообразия кода. Посмотрим насколько код единообразный.
Вот например, два способа выделить память:
Ну да, ну да, это просто фишка функции new, которую мало кто использует. Ладно будем считать это не критичным.
Вот например, два способа создать переменную:
Ладно, ладно, var используется реже и в основном для резервирования под именем определённого типа или для глобальных переменных неймспейса.
Ладно, с натяжкой будем считать Go единообразным языком.
«Колбасный» код
А вот ещё частая проблема, конструкция вида:
Это типичный кусок кода на Go, назовём его условно колбасой. Среднестатистический код на Go состоит на половину из таких колбас. При этом первая колбаса сделана так result, err := function(), а все последующие так result, err = function(). И в этом не было бы проблемы, если бы код писался только один раз. Но код — штука живая и постоянно приходиться менять местами колбасы или утаскивать часть колбас в другое место и это вынуждает постоянно менять оператор := на = и наоборот, что напрягает.
«Компактный» язык
Когда читаешь книгу по Go, не перестаёшь удивляться компактности, кажется что все конструкции продуманы так, чтобы код занимал как можно меньше места как по высоте, так и по ширине. Эта иллюзия быстро рушится на второй день программирования.
И в первую очередь из-за «колбас», о которых я упоминал чуть выше. Сейчас ноябрь 2018 и все Go программисты ожидают версию 2.0, потому что в нём будет новая обработка ошибок, которая наконец покончит с колбасами в таком количестве. Рекомендую статью по ссылке выше, в ней суть проблемы «колбасного» кода разъяснена наглядно.
Но новая обработка ошибок не устранит все проблемы компактности. По прежнему будет не хватать конструкций in и not in. На текущий момент проверка нахождения в map значения выглядит так:
И единственное на что можно надеяться — на то, что после компиляции это будет скукожено до просто проверки значения, без инициализации попутных переменных.
Молодой язык и бедный синтаксис
К Go существует очень много написанного кода. И есть просто потрясающие вещи. Но не редко вы выбираете между очень плохой библиотекой и просто приемлемой. Например SQL JOIN в одном из лучших ORM в GO (gorm) выглядит так:
А в другом ORM вот так:
Что ставит пока под сомнение вообще необходимость использовать ORM ибо нормальной поддержки защиты от переименования полей не везде просто нет. И ввиду компилируемой природы языка может и не появиться.
А вот один из лучших образцов компактного роутинга в вебе:
Не то чтобы здесь было что-то плохое, но в динамических языках код обычно выглядит более выразительным.
Спорные недостатки
Публичные функции
Угадайте, как сделать функцию публичной для использования в других пакетах? Здесь есть два варианта: либо вы знали или никогда бы не угадали. Ответ: зарезервированного слова нет, нужно просто назвать функцию с большой буквы. В это вляпываешься ровно один раз и потом привыкаешь. Но как питонист помню про правило «явное лучше неявного» и предпочёл бы отдельное зарезервированное слово (хотя если вспомнить про двойное подчёркивание в питоне, то чья бы корова мычала).
Многоэтажность
Если вам нужен словарь объектов, то вы напишите что-то такое:
Пугающая конструкция, не правда ли? Глазу хочется каких-нибудь скобочек, чтобы не спотыкаться. К счастью они возможны:
Но это всё, что позволит вам форматтер go fmt, который почти наверняка будет использоваться в вашем проекте для переформатирования кода при сохранении. Все остальные вспомогательные пробелы будут выпилены.
Атомарные структуры
Их нет. Для синхронизации надо явно использовать мьютексы и каналы. Но «безопасный язык» не будем вам пытаться мешать писать одновременно из разных потоков в стандартные структуры и получать падение программы.
helgihabr любезно напомнил, что в 1.9 появился sync.Map.
Тестирование
Во всех не очень безопасных языках безопасность хорошо реализуется через тестирование с хорошим покрытием. В Go с этим почти всё в порядке, кроме необходимости писать колбасы в тестах:
Понимая ущербность данного подхода, мы сразу нашли в сети библиотеку, реализующую assert и доработали её до вменяемого состояния. Можно брать и использовать: https://github.com/vizor-games/golang-unittest.
Теперь тесты выглядят так:
Две конвертации типов
В языке сущность интерфейса имеет особый статус. Они в том числе часто используются, чтобы заткнуть «бедность» синтаксиса языка. Выше уже был пример с реализацией шаблонов через интерфейсы и неявным вредным спецэффектом, порождённым этим случаем. Вот ещё один пример из этой же серии.
Для преобразования типов можно использовать обычную конструкцию в Си-стиле:
Но не пытайтесь применить её к интерфейсам, ибо для них синтаксис другой:
И это довольно долго будет вас путать. Я для себя нашёл следующее правило для запоминания.
Преобразование слева называется conversion, его корректность проверяется при компиляции и в теории для констант может производится самим компилятором. Такое преобразование аналогично static_cast из Си++.
Преобразование справа называется type assertion и выполняется при выполнении программы. Аналог dynamic_cast в Си++.
Исправленные недостатки
Пакетный менеджер
vgo одобрен, поддерживается JetBrains GoLand 2018.2, для остальных IDE как временное решение подойдёт команда:
Да, это выглядит как небольшой костыль сбоку, но это отлично работает и просто реализует ваши ожидания по версионированию. Возможно в go2 этот подход будет единственным и нативным.
В версии 1.11 эта штука уже встроена в сам язык. Так что верной дорогой идут товарищи.
Достоинства
мы сразу сообщаем рантайму, что, в независимости от того каким и где будет выход из функции, в конце надо выполнить определённый код. Это сразу частично решает проблему с отсутствием деструкторов и почти полностью решает проблему отсутствующих контекстов (например питоновский with).
Почему так получилось
Go выглядит как надмножество Си. Об этом говорит очень многое: и похожесть синтаксиса и понимание того, как это может быть легко преобразовано в Си код. Конечно же горутины, сборка мусора и интерфейсы (а вместе с ним RTTI) нетипичны для Си, но весь остальной код легко конвертируется практически регулярками.
И вот эта природа, на мой взгляд, и диктует почти все приведённые выше странности.