Иногда меня пробирает на то, чтобы палкой поковырять какой нибудь ЯП. Вот некоторое время назад добрался до
Go.
Когда я в первый раз (лет 5 назад) посмотрел на Go, и увидел, что функции в стандартной библиотеке начинаются с заглавной буквы, а-ля fmt.Printf, то сразу закрыл это дело, ибо в то время заглавные буквы в названии функций не вязались с моим представлением о мире. Видимо, за 5 лет я таки поумнел (или ещё больше поглупел) и посмотрев на Go со второго раза, этот ЯП таки меня не отвратил. Надо сказать, за это время куча довольно серьёзных проектов взлетело, которые используют Go, например - Docker.
Почитал
A Tour of Go и
Go Bootcamp, посмотрел доклады с разных конференций -
раз,
два,
три,
четыре. Стоит ещё пошелестеть
Effective Go, для более отчётливого восприятия.
Весьма простятский язык программирования, этот Go. Именно это и является его фишкой. Ну то есть отсутствие фишек - уже само по себе фишка :)
Из приятных моментов, что присутствуют в Go:
- Результат компиляции - один бинарник - очень удобно!
- Довольно богатая стандартная библиотека
- Кросс-компиляция. Супер!
- Т.н. "горутины" (goroutines) и каналы (channels) для асинхронностей
- Сборщик мусора
- go-fmt - Вот это вообще чума, я считаю :) Код форматируется одним правильным стилем. Другие стили, соответственно, неправильные :)
Из странного:
- ООП в Go по меньшей мере странное. Неявные интерфейсы, довольно часто приходится делать приведение к странному типу interface{}.
- Названия функций с заглавной и прописной буквы - типа конвенция для определения публичной и приватной функции.
- Отсутствие генериков. Говорят, генерики хотят добавить, но пока не придумали как это всё должно выглядеть.
Надо сказать, поддержка в радакторах оставляет желать лучшего, но всё таки становится более-менее приемлимой. Я пробовал настроить Vim и таки нет: Vim использовать как IDE - это отдельная форма извращения. Пробовал Atom: получилось весьма неплохо - плагин go-plus правда имел некоторые трудности восприятия окружения на моём компьютере, по сему я решил посмотреть плагин для IDEA. И не ошибся - плагин для Go в IDEA молодец. Пока не супер-супер, но молодец - жить можно.
Долго думал, какова же ниша для Go. Язык простой, с неплохой библиотекой, но в языке отсутствуют некоторые конструкции, которые так любят ынтерпрайзные программисты (генерики, например), ну и система типов не предохраняет от критичных ошибок. Низкоуровневый код на Go писать не будешь - нет таких возможностей для управления памяти как в C/C++. Ынтерпрайз? - там жёстко сидят Java и C# - уже понаписано куча всяких библиотек и отлажено сто-тыщ-миллиардов ситуаций. Судя по всему, на Go переползают с Ruby, Python, Node.js итп.
Плюс, на Go очень модно стало писать утилиты для командной строки. Например тот же Сloud Foundry выкинул утилиты которые были написаны на Ruby и теперь используют Go... Docker и etcd написаны на Go.
Поддержка в языке всяких "горутин" навивает на мысль, что на Go должно быть весьма удобно писать всякие сетевые сервисы или даже REST - почему бы нет. Но в таком случае возникает вопрос, что даст мне Go по сравнению с Java. Наверное, ничего.
Для себя сделал вывод - на Go программировать было бы вполне ОК, хоть язык довольно и скучный. Для командной разработки Go подошёл бы очень хорошо. В то же время, если у меня рядом есть молоток в виде Java, то непонятно, почему я решил бы использовать Go. Вероятно, всё тот же пресловутый memory footprint мог бы сыграть Go на руку.
Вобщем... пойду на
Rust посмотрю :)