Чем интересен язык Go
1. Прост и лаконичен. Он настолько прост, что в языке всего 25 ключевых слова (для сравнения 50 в Java, 90 в C++, а в 1С даже не считая языка запросов и языка СКД - целых 151).
2. Обратно совместим. Уже с самой первой версии языка, разработчики Go пообещали, что любой написанный код будет успешно выполняться на всех последующих версиях языка. Всем знакомы примеры, когда код перестал работать при переходах Python 2 -> Python 3, PHP 3 -> PHP 4 -> PHP 5, 1C 7.7 -> 1C 8.0/8.1 -> 1C 8.3/8.5... А на Go можно найти репозиторий десятилетней давности и он сразу будет работать на текущем компиляторе!
3. Единый стиль. С языком поставляются стандартные проверки оформления и стиля кода - "go fmt" (правильное форматирование), "go vet" (проверка на ошибки и подозрительные места) и "golint" ("дотошник" по стилю, который отругает даже за лишний перенос строк или его отсутствие). Как результат, большинство проектов на Go выглядят очень похоже и для программистов не проблема переключатся между проектами и заняться чем-то новым.
4. Уникальные конструкции. По сути это местный синтаксический сахар и возможно подобное есть в других языках, но я встречаю такое впервые. Ключевое слово Defer описывает команды, которые нужно выполнять при завершении текущей процедуры - т.е. если вы явно открыли файл, то тут же можете оставить завершающую команду по его закрытия, чтобы бы не забыть и далее описывать только логику чтения/записи. Slice как уникальный динамический массив, чтобы явно не выделять память и потом не заниматься явным переносом данных на новое место, когда нужно добавить элемент в уже переполненный массив.
5. Особая обработка ошибок. Большинство функция возвращают два результата - сам результат и ошибку (если ошибки не было, то nil), а разработчик в точке вызова сам думает что с этим дальше делать. Исключений и Try-Catch тут как таковых нет, но можно бросить "панику", которую нужно в текущем потоке (горутине) обработать в блоке defer или вся программа упадет. А еще тут любая ошибка - это по своей сути просто строка без стека вызова.
6. Использование отсутствия переменной - "_" (нижнее подчеркивание). Как я упомянул выше, многие вызовы возвращают сразу два значения - свой результат и ошибку (а при переборе коллекций - индекс элемента коллекции и его значение), но когда они не нужны, то вместо переменной указываем "_" (если создадим переменную, а потом с нею ничего не сделаем, то получим на орехи от линтера)
7. Сильная стандартная библиотека. Из коробки сразу есть работа с файлами, JSON, сетевыми подключениями и так далее.
8. Встроенное тестирование. Можно обойтись без внешних фреймворков тестирования - достаточно "go test", который может и все тесты прогнать, и гонку данных найти, и покрытие кода посчитать. Особенность - тесты не выносятся в отдельные директории и лежат прямо рядом с тестируемым кодом внутри своих пакетов (а потому имеют доступ к не-экспортируемым свойствам и методам) и их файлы имеют предопределенный суффикс в названии "*_test.go". А так же есть поддержка "примеров использования" - это подвид тестов, где имя функции начинается на префикса "Example*", и где показан пример вызова с некими значениями и описан ожидаемый результат (с ним идет сравнение при тестировании).
9. Встроенная документация. Код и тесты с примерами формируют автодокументацию, которую можно просматривать стандартными утилитами: "go doc" для консоли и "godoc" или pkgsite для веб-версии.
===
Понимаю, что весьма поверхностные впечатления. Если бы я поработал несколько месяцев, то очевидно уже делал бы акцент на взаимодействии параллельных потоков, на особенностях сборщика мусора, на утечке памяти при использовании слайсов и прочих важных технических вещах.
Вероятно нужно сделать что-то более серьёзное, чтобы прочувствовать всю силу гоферной философии и поймать хотя бы половину популярных шишек на граблях. Но пока в новом языке все выглядит очень просто и радужно. Особенно на фоне опыта с 1С 🥸
#обучение #Go
Post #372
219
- 🔥 5
- 👍 1