1. Быстрый старт: императивный синтаксис, строгая типизация и отказ от виртуальной машины BEAM
Быстрый старт: императивный синтаксис, строгая типизация и отказ от виртуальной машины BEAM
Привет! Если ты читаешь это, значит, ты решил расширить свой арсенал и добавить Go к своим навыкам Erlang. Это отличный выбор для рынка труда.
Я знаю, что у тебя СДВГ, поэтому мы не будем тратить время на воду. Мы будем двигаться быстро, четко и фокусироваться на том, что действительно отличается. Твой мозг привык к паттернам Erlang: неизменяемость, рекурсия, акторы. Go сломает эти паттерны, но взамен даст тебе мгновенную обратную связь от компилятора и простую ментальную модель.
Давай разберем три главных шока, которые ждут тебя при переходе: императивность, типы и отсутствие BEAM.
1. Императивный мир: Забудь про рекурсию (почти)
В Erlang ты привык описывать что должно быть сделано. В Go ты описываешь как это сделать, шаг за шагом.
Переменные изменяются
В Erlang N = N + 1 — это математическая ложь и синтаксическая ошибка (если N уже связано). В Go — это норма жизни.
> Изменяемость (mutability) — это не баг, а фича в Go. Память переписывается. Это экономит ресурсы, но требует внимания.
Смотри разницу:
Erlang (Рекурсия):
Go (Цикл):
В Go нет хвостовой рекурсии (Tail Call Optimization). Если ты попытаешься написать бесконечный цикл через рекурсию, как в Erlang, ты получишь переполнение стека (stack overflow). Для повторения действий всегда используй for. В Go это единственный вид цикла.
!Слева: Рекурсивный подход Erlang. Справа: Итеративный подход Go с изменяемым состоянием.
Почему это хорошо для СДВГ?
Императивный код читается сверху вниз. Тебе не нужно держать в голове стек вызовов. Ты видишь строку, и она делает ровно то, что написано. Это снижает когнитивную нагрузку при чтении чужого кода.
2. Строгая статическая типизация: Компилятор — твой лучший друг
В Erlang типизация динамическая. Ты часто узнаешь об ошибке, когда процесс падает с function_clause или badmatch в продакшене.
В Go компилятор не даст тебе собрать программу, если типы не сходятся. Это мгновенная обратная связь, которая так важна для нашего мозга. Ты получаешь дофаминовое подкрепление каждый раз, когда код компилируется успешно.
Объявление типов
В Go ты обязан сказать, чем является переменная (или позволить компилятору вывести это явно).
Структуры вместо Рекордов
В Erlang у нас есть Records (которые на самом деле кортежи) и Maps. В Go основным строительным блоком данных является Struct (структура).
Erlang:
Go:
Если ты попытаешься положить строку в поле Age, Go просто не скомпилируется. Никаких сюрпризов в рантайме.
Интерфейсы: Утиная типизация
Это самая мощная фича Go. Тебе не нужно явно писать implements, как в Java. Если структура имеет методы, которые требует интерфейс, она автоматически его реализует.
Представь, что у тебя есть поведение GenServer. В Go ты бы описал интерфейс:
Любая структура, у которой есть метод Work() error, считается Worker. Это дает гибкость динамических языков, но с защитой статической типизации.
3. Отказ от BEAM: Прямой доступ к железу
Это, пожалуй, самый важный ментальный сдвиг.
Erlang работает на виртуальной машине BEAM. BEAM — это чудо инженерии: он управляет памятью, планирует процессы, обеспечивает изоляцию ошибок. Но за это приходится платить накладными расходами.
Go компилируется в нативный машинный код.
Что это значит на практике?
go build) — это один файл. В нем уже есть все библиотеки и рантайм Go. Его можно просто скопировать на сервер и запустить. Никаких установок Erlang/OTP на целевой машине.!Go работает напрямую с операционной системой, минуя виртуальную машину.
Где "Let it crash"?
В Erlang мы привыкли: "Пусть падает, супервизор поднимет".
В Go паника (panic) — это катастрофа. Если горутина паникует и это не перехвачено, падает вся программа, а не только один процесс.
Поэтому в Go принят другой подход к ошибкам: явная проверка.
Для Erlang-разработчика это выглядит многословно. Но для рынка труда это стандарт надежности. Ты всегда знаешь, где и почему может сломаться твой код.
Резюме для твоего мозга
Давай закрепим основные отличия, чтобы они отложились в памяти:
| Характеристика | Erlang (BEAM) | Go (Native) |
| :--- | :--- | :--- |
| Синтаксис | Декларативный, функциональный | Императивный, процедурный |
| Переменные | Неизменяемые (Immutable) | Изменяемые (Mutable) |
| Повторение | Рекурсия | Цикл for |
| Типизация | Динамическая, сильная | Статическая, сильная |
| Исполнение | Байт-код в VM | Машинный код (бинарник) |
| Ошибки | Let it crash | Проверяй if err != nil |
Почему это поможет тебе найти работу?
Бизнес любит Go за предсказуемость.
Ты уже знаешь распределенные системы благодаря Erlang. Добавив к этому производительность и популярность Go, ты становишься уникальным специалистом, способным решать задачи, которые не под силу "чистым" гоферам или эрлангистам.
В следующей статье мы нырнем в то, ради чего мы здесь собрались — Горутины и Каналы, и посмотрим, как они соотносятся с процессами Erlang и receive.
Готовься, будет интересно!