Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

01.11.2023

Порівняння API вводу/виводу JavaScript та Go

Так вже вийшло, що останнім часом я спочатку працював з потоками в JavaScript (модуль stream), а потім — з модулем io в Golang. Обидва модулі реалізують ввід/вивід в загальному сенсі цього слова, але підхід зовсім різний та його цікаво порівняти.

Модуль stream побудований навколо асинхронних примітивів JavaScript - від подій до генераторів та async/await. Важливо, що ввід/вивід завжди вимагають блокування, тобто пасивного очікування. А в JavaScript немає можливості блокувати синхронний код. Тому при використанні модуля stream нам доведеться ускладнювати код — хоч сучасний підхід з async/await мені подобається та майже не напружує розуміння.

(Примітка: в JavaScript є декілька функцій, які здійснюють синхронний ввід/вивід, наприклад, fs.readFileSync. Вони реалізовані через вихід в C, тобто фактично “ламають” модель виконання. Ось детальне пояснення.)

Важлива функція абстракції вводу-виводу — це додавання логіки зі збереженням інтерфейсу. В JavaScript для цього є функція pipeline. Наприклад, нею можна додати до потоку запису в файл стискання. Або до читання з сокета — буферизацію.

Результат виконання pipeline - теж потік, тобто споживачам коду не потрібно знати, що в нього всередині. Також приємно, що pipeline приховує асинхронність всередині та залишає тільки зовнішню.

Про Go - завтра.