Наскільки популярна мова Го? Іноземні країни, такі як Google, AWS, Cloudflare, CoreOS тощо, а також вітчизняні компанії, такі як Qiniu та Alibaba, почали використовувати мову Go для розробки своїх продуктів, пов'язаних із хмарними обчисленнями у великому масштабі. На які «так» і «але» слід звертати увагу при використанні мови Го? Нещодавно ми написали API на основі мови Go — відкритої мови програмування, запущеної Google у 2009 році. У процесі використання Go для розробки ми здобули багато досвіду і хочемо поділитися цим із читачами, тому маємо цю статтю.
Обираючи мову програмування для проєкту, ми завжди рекомендуємо зрозуміти, на чому буде будуватися проєкт, перш ніж вирішувати, на якій мові розвивати. Нехай продукт буде вирішальним фактором у тому, як його слід створити.
Ось деякі плюси та мінуси, які ми виявили під час розробки з Go, щоб допомогти вам зрозуміти, чи підходить він для вашого наступного проєкту.
Що ми любимо в Go
Використання мови Го різко зросло останніми роками. Здається, кожен стартап використовує його для бекенд-систем. Існує багато причин, чому розробники вважають її такою популярною.
Мова Го дуже швидка
Go — це дуже швидка мова програмування. Оскільки Go компілюється у машинний код, він природно перевершує мови програмування, які є інтерпретативними або мають віртуальний рівень виконання. Програми Go також дуже швидко компілюються і створюють дуже маленькі бінарні файли. Наш API компілюється всього за кілька секунд, у результаті чого виконуваний файл розміром становить 11,5 МБ.
Легко опанувати
Синтаксис мови Го простий і легкий для розуміння порівняно з іншими мовами. Ви можете запам'ятати більшість синтаксису Go у голові, тож не доведеться витрачати багато часу на пошуки. Мова Го також дуже чиста і легка для читання. Програмісти без Go, особливо ті, хто звик до синтаксису C-стилю, можуть читати код програми Go і розуміти, що відбувається.
Статична мова визначення типів
Go — це потужна статична мова, що визначає тип. Існують базові типи, такі як int, byte і string. Існують також типи споруд. Як і в будь-якій сильно типізованій мові, система типів дозволяє компілятору допомагати виявляти помилки для всього класу. Мова Go також має вбудовані типи списків і карт, і вони також прості у використанні.
Тип інтерфейсу
Мова Go має типи інтерфейсів, і будь-яка структура може просто задовольнити інтерфейс, реалізувавши цей інтерфейс. Це дозволяє відокремити залежності у вашому коді. Потім ви можете симулювати свої залежності у тестах. Завдяки використанню інтерфейсів ви можете писати більш модульний, тестований код. Мова Go також має першокласні функції, що дозволяє розробникам писати код більш практично.
Стандартна бібліотека
Мова Go має досить хорошу стандартну бібліотеку. Він забезпечує зручні вбудовані функції для обробки базових типів. Деякі пакети полегшують створення веб-сервера, обробку вводу/виводу, використання шифрування та обробку сирих байтів. Серіалізація та десеріалізація JSON, які надає стандартна бібліотека, дуже прості. Використовуючи «теги», ви можете вказати ім'я поля JSON поруч із полем struct.
Підтримка тестування
Підтримка тестів вбудована у стандартну бібліотеку і не потребує додаткових залежностей. Якщо у вас є файл під назвою thing.go, напишіть тести в іншому файлі під назвою thing_test.go і запустіть "go test". Го проведе ці тести швидко.
Інструменти статичного аналізу
Інструменти статичного аналізу мови Go численні та потужні. Один із інструментів — gofmt, який форматує код відповідно до запропонованого стилю Go. Це може нормалізувати багато думок проєкту, дозволяючи менеджеру з нагород зосередитися на виконаній роботі коду. Ми запускаємо gofmt, golint і vet для кожної збірки, і якщо знайдемо якісь попередження, збірка провалиться.
Збір сміття
Під час розробки мови Go керування пам'яттю було навмисно спроєктоване так, щоб бути простішим, ніж на C та C++. Об'єктом динамічного розподілу є збір сміття. Мова Go робить використання вказівника більш безпечним, оскільки не дозволяє виконувати операції з вказівниками. Також передбачена опція використання типів значень.
Простіша модель паралелізму
Хоча паралельне програмування ніколи не буває легким, Go легше програмувати одночасно, ніж інші мови. Створення легкого потоку під назвою «goroutine» і спілкування з ним через «channel» — це майже просте завдання, але це можливо для більш складних моделей.
Що нам не подобається в Go
Як ми вже обговорювали, Го справді є чудовою мовою. Він має чистий синтаксис і швидко виконується. Він також має багато переваг. Але вся мова програмування стосується не лише її синтаксису. Ось деякі проблеми, з якими ми зіткнулися.
Дженериків не існує
По-перше, ця проблема, як слон у кімнаті, є очевидним і недооціненим фактом. У мові Го немає жодних генериків. Для розробників з таких мов, як Java, перехід на Go — це величезна перешкода. Це означає, що рівень повторного використання коду знижується. Хоча мова Go має першокласні функції, якщо ви пишете такі функції, як «map», «reduce» та «filter», які призначені для роботи з одним типом колекції, ви не можете повторно використовувати ці функції для інших різних типів колекцій. Існує багато способів вирішити цю проблему, але всі вони змушені писати більше коду, що знижує продуктивність і обслуговуваність.
Інтерфейс є неявним
Хоча зручно мати інтерфейси, структура реалізує інтерфейси імпліцитно, а не явно. Вважається, що це одна з сильних сторін мови Go, але за структурою нам було важко зрозуміти, чи реалізовано вона інтерфейси. Ви можете зрозуміти це лише, намагаючись скомпілювати програму. Якщо програма невелика, в цьому точно немає нічого поганого. Але якщо ця програма має середній або великий масштаб, проблема велика.
Слабка підтримка бібліотек
Підтримка бібліотек Go нерівномірна. Наш API інтегрується з Contentful, але останній не має офіційно підтримуваного Go SDK. Це означає, що ми маємо писати (і підтримувати!) Багато коду для запиту та аналізу даних у Contentful. Ми також маємо покладатися на сторонні бібліотеки Elasticsearch. Go SDK, надані постачальниками, не такі популярні, як їхні аналоги на Java, Ruby чи JavaScript.
Комунікація в громаді складна
Спільнота Go може не приймати такі пропозиції. Розгляньте це у репозиторії голінта на GitHub:Вхід за гіперпосиланням видно., користувач попросив Golint мати можливість провалити збірку, коли знайшов попередження (саме це ми робимо в проєкті). Захисники одразу відкинули цю ідею. Однак, оскільки надто багато людей коментували цю проблему, через рік підтримувачі нарешті змушені були додати запитувані функції.
Спільнота Go, здається, теж не любить веб-фреймворки. Хоча бібліотека HTTP мови Go охоплює багато аспектів, вона не підтримує параметри шляху, перевірку введення та валідацію, а також не підтримує перехресні питання, поширені у веб-додатках. Розробники Ruby мають Rails, Java — Spring MVC, а Python — Django. Але багато розробників Go обирають уникати використання фреймворків. Однак реальність така, що рамок не існує, навпаки, їх багато. Але як тільки ви починаєте використовувати фреймворк для проєкту, майже неможливо уникнути долі покинутості.
Фрагментоване управління залежностями
Довгий час мова Go не мала стабільного, формального менеджера пакетів. Після років прохань спільноти проєкт Go лише нещодавно випустив godep. До цього вже існувало багато інструментів для заповнення цієї прогалини. Ми використовуємо дуже потужний govendor у нашому проєкті, але це означає, що спільнота розділена, що може бути дуже заплутаним для розробників, які новачки в мові Go. Крім того, майже всі менеджери пакетів працюють на репозиторіях Git, і історія репозиторіїв Git може змінюватися у будь-який момент. Порівняйте з Maven Central, який ніколи не видаляє і не змінює бібліотеки, від яких залежить ваш проєкт.
Вирішіть, чи використовувати Go чи ні
Іноді потрібно думати про машину. Коли ви надсилаєте та отримуєте байти. Коли ви керуєте тисячами одночасних процесів. Ви також можете писати операційну систему, контейнерну систему або блокчейн-вузол. У таких випадках, найімовірніше, вам байдуже до генериків. Бо ви зайняті тим, щоб витиснути продуктивність на наносекунду з чіпа.
Однак часто потрібно думати про людей. Дані про бізнес-сферу, з якими вам потрібно працювати: клієнти, працівники, продукти, замовлення. Потрібно написати бізнес-логіку, яка працює на цих доменних сутностях, і підтримувати цю бізнес-логіку багато років. І вона має враховувати змінні потреби, і чим швидше, тим краще. У таких випадках важливий досвід розробника.
Go — це мова програмування, яка цінує машинний час більше, ніж людський. Іноді у вашій сфері продуктивність машини чи програми є найкритичнішою. У таких випадках Go може бути хорошою альтернативою C або C++. Але коли ви пишете типовий n-рівневий додаток, часто виникають вузькі місця продуктивності в базі даних і, що важливіше, у тому, як ви будете моделювати ці дані.
Вирішуючи, чи використовувати мову Го, враховуйте такі загальні правила:
- Якщо ви маєте справу з байтами, то мова Go може бути хорошим вибором.
- Якщо ви маєте справу з даними, то мова Go може бути не найкращим вибором.
Це може змінитися колись у майбутньому. Мова та спільнота Го ще молоді. Вони можуть здивувати нас додаванням дженериків; Або популярний вебфреймворк виграє значно. Однак наразі ми залишимося на зрілих мовах програмування з універсальною підтримкою, зрілим управлінням залежностями та акцентом на моделювання бізнес-домену.
|