Перед тим як написати конкретні причини, спочатку я розкажу вам трішки про саму сферу використання цієї мови програмування.
З кожним роком, blockchain технології розвиваються і найпопулярнішими являються так звані ethereum like блокчейни. По факту це просто висхідний код ethereum, трохи модифікований або взагалі без єдиних змін і запущений з іншою назвою і своїм комʼюніті. Так ось, блокчейн ethereum написаний на мові програмування Go, а тому діставати інформацію і писати в ethereum like блокчейни найпростіше з мови програмування Go. Ви звичайно можете зауважити, що бібліотека web3 в JavaScript теж просто неперевершена та ще й можна шерити код між бекендом і фронтендом, але… Це можна застосувати до апок у яких мінімальний бекенд, або зовсім відсутній. Я ж розкажу вам про кейси де бекенд грає важливу роль і має бути написаний саме на Go.
Блокчейн сканери – це бекенд мікросервіс який має постійно запитувати у блокчейну нові блоки, транзакції, івенти. Це дуже поширений софт який є в кожному великому проєкті. Основна задача таких мікросервісів дістати потрібні транзакіїї, занести в БД інформацію, відправити вебхуки і багато іншого. Такий сервіс має дуже швидко працювати, тому як в деяких блокчейнах нові блоки виходять кожні 2 секунди і бувають ситуації, в яких не буде вистачати швидкості асинхронного Node.js, потрібна швидкість Go, яка дозволяє виконувати задачі саме паралельно. Тим паче на Go ви можете запустити декілька сканерів як одну апку просто запустивши пул горутин, які будуть паралельно оброблювати інформацію з різних блокчейнів.
Крипто проєкти готові платити від 1000$ за простий сканер, який просто буде викачувати інформацію в постгрес + просте api, щоб діставати інформацію.
Крипто обмінники/магазини – дуже популярні сервіси в наш час, які зʼявляються кожен день нові і нові, а це означає, що хтось має їх створювати. Коротко описуючи кейс: ми деплоїмо в блокчейн контракт, який буде проводити перекази erc20 токенів, але при цьому дописувати так званий “коментар” по якому ми будемо розуміти ідентифікатор обміну/купівлі. Тут по аналогії з сканером, ми дістаємо потрібну інформацію, але вже пишемо суміжний сервіс, який після отримання підтверждення має передати в інший мікросервіс інформацію для виплати фіатних грошей. Як ви можете здогадатись, сервіс для виплат теж має бути надійним і швидким.
За крипто обмінники замовники готові платити від 5000$
Тепер поговоримо саме про Go, я вище писав про швидкість про пули і горутини, зараз я поясню як це працює і за рахунок чого.
1) Go являється мовою і одноіменним компілятором, це означає що ваші програми це повноцінні executable файли, наприклад scanner.exe, які працюють незалежно від всяких vendor, node_modules і тд папок. Така програма це скомпільовані асемблерні команди, які без посередників передаються на виконання в операційну систему.
2) Go це багатопотокова мова, це означає що ви можете виконувати різні задачі незалежно одна від одної не блокуючи при цьому одна одну. Для прикладу, в Node.js якщо ви зробите простий веб сервер і один з реквестів буде щось довго рахувати використовуючи процесорний час, то інші запити не зможуть почати обробку, буде не буде закінчена обробка такого запиту. В Go різні запити будуть паралельно рахуватись в різних потоках, або взагалі на різних ядрах процесора. Найбанальніший синтетичний приклад, це дістати з БД дані про транзакціїї, порахувати суми використовуючи формули з корнями і квадратами, потім серіалізувати дані в JSON і кудись відправити.
3) Надзвичайно простий код. Всі ви знаєте, що є C++, але там для паралельного програмування ви напишите в 10 разів більше коду і це не буде гарантією, що він буде безпечний. Часто буває коли ми з різних потоків маємо наповнювати один масив даних, для цього в Go є дуже зручні і легкі у використанні інструменти, такі як канали і мʼютекси. Також у порівнянні з умовною Java, ви будете писати набагато менше слів, при цьому вирішуючи набагато більше бізнес задач. Банальний приклад, приватне і публічне поле в Java має маркуватись приставкою public або private перед назвою поля класу. В Go ж, щоб поле стало публічним, достатньо написати його з великої букви. В C++ вам потрібно ініціалізувати Thread імпортувавши спеціальну бібліотеку, потім ви маєте запустити поток, в Go вам достатньо перед викликом функціїї написати go і вона почне виконання у окремому потоці.
4) Вбудований в компілятор менеджер пакетів. Всі ви знаєте, що в популярних мовах програмування ви маєте окремо докачати менеджер пакетів, такі як composer, npm, pip. Буває, що менеджери пакетів дуже повільно розвиваються і це призводить до появи інших менеджерів пакетів, як приклад pnpm, який прийшов на заміну npm. В Go вбудований менеджер пакетів. Просто пишеш go get <посилання на лібу на github> - все. Із коробки маєш швидкий і надійний менеджер пакетів.
5) Багата вбудована бібліотека. В таких мовах як php, js, щоб по людьски робити http запити, ти маєш скачати GuzzleHttp або axios відповідно. В Go ти можеш не завантажуючи сторонніх бібліотек зручно працювати з http (в тому числі зробити веб сервер), базами даних, шифруванням і це справді зручно. Так для http серверів розробники віддають перевагу стороннім web серверам, але для http запитів, я наприклад ніколи навіть і не думав завантажувати якусь лібку. Працювати з json теж дуже приємно, бо у вас є можливість, нічого не встановлюючи, десеріалізувати дані одразу в типізовані структури даних Go.
6) Сувора типізація даних. Роки, коли користувачам хотілось не вказувати типи даних пройшли, в PHP використовувати type hint’s це стандартний обовʼязок, JS розробники теж все частіше надають перевагу TypeScript бо явне типізування даних, якісно впливає на підказки в вашій IDE або в текстовому редакторі і звичайно ж анулює дуже багато можливих помилок. Але варто розуміти, в Go типи даних справжні, це не type hint, якщо це int32 то це справжні 4 байти в які ві нічого окрім int32 не запишите.
7) Важливий пункт для Blockchain розробників – зручна робота з байтами. Найбільш ефективним способом викликати та читати транзакції з блокчейну - це робота з “сирими” байтами. По перше це висока надійність і швидкість роботи, ви не марнуєте час на автоматичну серіалізацію даних рефлексією мови, а явно вручну збираєте байти і передаєте їх ноді.
8) Низька конкуренція. Взагалі це плюс і мінус, джуном вам буде дуже важко знайти постійну роботу, але якщо ви впевнений мідл, вас загребуть з руками і ногами. Якщо не вірете, просто напішить в вашому Linkedin, що ви Go розробник і побачите як вас завалять листами ейчари.
Мінуси
1) Мова ідеологічно проста, тому вже банальні для інших мов програмування дженеріки, доволі недавно і дуже прості. Часто вам доведеться все таки робити окремі методи для різних вхідних або вихідних типів даних. ООП теж дуже просте, абстрактних класів, віртуальних або протектед методів ви тут не побачите.
2) Свапнутись з іншої мови може датись не дуже легко, особливо якщо ви на інший мові мали впевнені знання і писали гарний чистий код. В Go гарний чистий код пишеться по іншому, хендл помилок (Exception в інших мовах) тут виглядає по іншому і хендлити помилки ви маєте завжди, після кожного методу, який їх повертає і обовʼязково обертати, щоб розуміти в якому саме місці ця помилка сталась. Також не варно тягнути в Go ідеологію “великих фреймворків” такі як Spring (Java), Laravel (PHP), тут це не вітається. Ви маєте обрати популярні і надійні бібліотеки з найменшим оверхедом і найкращими показниками бенчмарків. Наприклад, ви можете знайти та завантажити бібліотеку для автоматичного валідування вхідних даних http запиту вказавши біля кожного поля структури правила, по типу max_len:10 і тд, але в великих проєктах так ніхто не робить.
3) Це не зовсім плюс, але деяким людям це може не сподобатись. Не на всі задачі ви знайдете готову реалізацію. У великих проєктах задачі бувають зовсім не типові де вам може довестить напрямую працювати з драйверами встановленими в операційну систему писати для цих драйверів свої обгортки. Не для всіх популярних API є готові SDK, частенько потрібно буде накидати свій клієнт, але плюс в тому, що в Go це буде зробити легко, але зробити доведеться.
Саммарі: Go мова, написана в час сучасних комп’ютерів, яка дозволяє з коробки на всю використовувати їх потужність. Go це як корисний сніданок - він принесе вам задоволення і відчуття легкості.
Це моя перша стаття у житті, тому не закидуйте камінням, дякую за увагу.