Walczę od jakiegoś czasu z aplikacjami real time - jakieś proste gry, itp. W Railsach do niedawna nie było możliwości zrobienia sensownego “streamingu”, od jakiegoś czasu jest ActionController::Live. Bawiłem się tym dłuższą chwilę i doszedłem do wniosku, że nie tędy droga. Przeszedłem już kilka kataklizmów w postaci serwerów w node.js (używając socket.io, sock.js, itp.). Tydzień temu zacząłem pisać w Go, próbując zaimplementować prosty czat z użyciem SSE. Moje wrażenia są mieszane. Jeśli chodzi o rozwiązania w postaci “gorutyn” i kanałów, to działają bardzo fajnie. Nie ma problemu z wyjątkami i “callback hell” jak w node.js. Największy problem stanowi dla mnie natura języków statycznie typowanych: już dawno nie bawiłem się w rzutowanie stringa na []byte, w celu wysłania go przez HTTP. Czasem mam wrażenie jakbym rył dłutem w skale… Na razie się nie poddaję, spróbuję rozwinąć trochę ten czat i zobaczymy co z tego wyjdzie.
Do tej pory napisałem parser plików XML, unarchiver zip/bzip2/gzip, HTTP/FTP fetcher, crawler, image scaler - tego typu rzeczy.
Używam na produkcji, zero zależności, zero problemów.
Wrażenia bardzo pozytywne - pisze się w tym dosyć łatwo, bardzo szybko i ogólnie przyjemnie.
Dobra dokumentacja, bogaty, wbudowany zestaw bibliotek.
Sam język ma prosty do ogarnięcia syntax, b. dobrze przemyślane ficzery - (Goroutines, slices, maps, first class functions), (w odróżnieniu od Scali, która ma wbudowane mnóstwo rzeczy nie wszystkie chyba do końca przemyślane), b. dobre narzędzia (szybki kompilator z inferencją typów, GC, profiler, debugger, race detector), aktywną społeczność.
Go to obecnie mój ulubiony język do pisania nowych rzeczy (poza tradycyjnym web developmentem, gdzie wciąż królują Railsy). Myślę, że ma odpowiedni potencjał na jeśli nie “pozamiatanie” w ciągu kilku lat w środowisku dynamicznych języków jak Ruby/Python to przynajmniej spore zamieszanie.
Czemu nie? Hypetrain jest super: jak eksploduje, to nagle jesteś potrzebnym i wartym mnóstwo hajsu specjalistą. A jak padnie, to poznałeś kolejny język programowania. Jak dla mnie win-win.
Niestety nie próbowałem Go, bo wydawał mi się zbyt bliski D (mojej niespełnionej miłości), a teraz z kolei gdybym szukał dobrego low-levelu to bym chyba wolał spróbować z Rust.
Główna zaleta tego języka, to nie niskopoziomowość, a sposób w jaki rozwiązano współbieżność (to właściwy termin?). Łatwo zrównolegla się kod - łatwo tworzy się nowe wątki (gorutyny - niby lżejsze od wątków). W przeciwieństwie do node.js, w Go nie ma wyjątków, które potrafią nieźle zamieszać w zrównoleglonym kodzie. Dzięki wbudowanym “kanałom”, w bardzo łatwy sposób można komunikować ze sobą wątki. Te cechy sprawiają, że bardzo fajnie pisze się w tym języku np. serwery sieciowe. Podobne odczucia miałem na samym początku w stosunku do node.js, ale szybko mi przeszło - debugowanie kodu w node.js to kataklizm. Jeśli miałbym doszukiwać się zalet tego, że język jest kompilowany, to na pewno jedną z nich jest ta, o której wspomniał Hosiawak - po skompilowaniu powstaje jedna binarka, w zasadzie bez zależnoci (linux-vdso, libpthread, libc, ld-linux-x86-64). Dodatkowo sporo błędów można wyłapać podczas kompilacji. Na samym początku mojej zabawy z Go mam często tak, że jeśli kod się skompiluje, to w zasadzie działa prawidłowo - tak jak bym tego oczekiwał.