Pierwszy weekend z językiem Go

Pierwszy weekend z językiem Go

Ostatnie kilka miesięcy mojego programistycznego życia to pełne skupienie na front-endzie. JavaScript – bo akurat na tej części skupiam się najbardziej – jest przed moimi oczami przez większość czasu poświęcanego na pracę i naukę. Pomimo tego, że spędzanie czasu z tym językiem i obserwowanie jego rozwoju nadal sprawia mi ogromną przyjemność, to od pewnego czasu czułem silną potrzebę spróbowania czegoś nowego – ot tak, dla rozrywki.

Jednym z języków który już od dłuższego czasu chodził mi po głowie był Go, który przewijał się gdzieś w tle w trakcie niejednej rozmowy w pracy i którego wychwalanie wiele razy widziałem na Hacker News oraz Twitterze.

No i w końcu stało się – weekend, Go i ja – co z tego wyszło? Zapraszam do przeczytania!

Nie jest to język z najlepszą stroną główną

Tak, to z pewnością. Jeśli chodzi o umiejętności sprzedaży swojego języka to twórcy Go zapewne nie należą do czołówki. Tak to już jest z tymi programistami, że wszystko co dla nich istotne to schemat kolorów w konsoli, a nie na “jakichśtampaniestronach”. Strona główna, czyli https://golang.org/,  prezentuje się bowiem tak:

Chińskie znaczki, chomik i video z Google I/O z 2012 roku. Eee… to z tym mam spędzić najbliższe godziny? No ale nic – nie ocenia się książki po okładce, tak jak nie ocenia się języka programowania po jego stronie głównej.

Zobaczymy, co będzie dalej….

…a wygląda na to, że będzie nieźle

Zastanawiam się czasami jakby to było, gdyby połączyć wybrane cechy takiego np. C, JavaScriptu oraz C# bądź Javy. Swoboda języka dynamicznie typowanego, bezpieczeństwo typowanego statycznie, szybkie działanie, wysokopoziomowa składnia, niska ilość pożeranych zasobów…

Do tej pory sytuacja wyglądała tak jak z tym popularnym sposobem wykonywania zleceń – jak ma być tanio, szybko i dobrze to wybierz dwa. Jak ma być wysoki poziom składni, to nie będzie szybko. Jak ma być typowanie dynamiczne, to czasami dostaniesz RuntimeException. Jak ma być szybko, to musisz pogrzebać przy wskaźnikach.

No ale nic, takie życie, co?

Tak, o ile nie programowałeś w Go. Tak przynajmniej stwierdzam czytając pierwsze fragmenty dokumentacji tego języka:

Programming had become too difficult and the choice of languages was partly to blame. One had to choose either efficient compilation, efficient execution, or ease of programming; all three were not available in the same mainstream language.

Go is an attempt to combine the ease of programming of an interpreted, dynamically typed language with the efficiency and safety of a statically typed, compiled language. It also aims to be modern, with support for networked and multicore computing.

It should take at most a few seconds to build a large executable on a single computer.

Ma być więc szybko, przyjemnie, a do tego lekko. Macie moją uwagę, panowie.

Zainstalujmy Go

Przygodę z Go zaczynałem pracując na Macu, a w planach miałem przeskakiwanie w międzyczasie na Windowsa. Jak Go radzi sobie z pracą na dwóch różnych platformach? Radzi sobie… bezproblemowo.

Zarówno na Macu jak i na Windowsie zacząłem od przeskoczenia przez kolejne kroki lekkiego instalatora. Po zakończeniu instalacji w konsoli miałem już dostępną zmienną globalną go, która reprezentuje coś co nazywa się go tool. Za pomocą tego narzędzia będziemy kompilować nasze projekty, testować je oraz pobierać do naszych projektów zewnętrzne zależności.

Go ma ściśle określony pomysł na organizację środowiska pracy – wszystko zaczyna się od zdefiniowania zmiennej środowiskowej GOPATH która wskazuje na katalog w którym będziemy umieszczać cały nasz kod pisany w tym języku. Na Windowsie będzie to C:\go a na Macu /usr/local/go.

Niezależnie od platformy na której pracujemy, katalog przypisany do GOPATH zawiera trzy podkatalogi:

  • src – zawierający kod źródłowy Go (rozszerzenie .go)
  • pkg – zawierający tzw. “package objects” skompilowane w sposób właściwy dla danej platformy (rozszerzenie .a)
  • bin – pliki wykonywalne w formacie właściwym dla danej platformy (na Windowsie z rozszerzeniem .exe, na Macu bin’y)

Dzięki wykorzystaniu takiej konwencji i określeniu zmiennej GOPATH narzędzie go tool może w łatwy sposób odnajdywać nasze paczki, kompilować je i umieszczać w formie wykonywalnej w katalogu bin – niezależnie od platformy wszystko działa tak samo.

Sprawdźmy, czy działa

Podążając za dokumentacją, po szybkiej konfiguracji środowiska przyszedł czas na uruchomienie przykładowego programu w Go.

Otwarłem więc VS Code i sprawdziłem najpierw, czy edytor ten posiada jakieś wsparcie dla języka z którym przyszło mi spędzać weekend. Coś jest – do tego ma ponad 470tys. pobrań i wygląda naprawdę nieźle!

Pobrałem więc wtyczkę do Go, wróciłem do widoku folderu i utworzyłem pierwszy plik (src/github.com/psmyrdek/hello/hello.go) którego będę chciał zaraz uruchomić. Po przejściu do pliku hello.go VS Code przywitał mnie sugestią, że fajnie byłoby pobrać kilka paczek które ułatwią mi pracę w tym języku – podpowiadanie składni, kolorowanie, formatowanie, itd. – no dobra, wierzę ci kolego.

Instalacja, chwila nerwów i jedziemy – zaraz stworzymy najlepsze hello world na świecie.

Aby uruchomić ten kawałek kodu przeszedłem w konsoli do lokalizacji określonej jako GOPATH/bin, a następnie uruchomiłem następujące polecenie:

go install github.com/psmyrdek/hello && hello.exe

Po wykonaniu tego polecenia na konsoli wyświetlił się napis Hello world, from PoznajProgramowanie.pl

Poczekajcie z brawami – to dopiero początek 😉

Od czego zacząć naukę Go?

Po uruchomieniu pierwszego programu miałem już gwarancję działającego środowiska, ale co dalej? Wymyślić jakiś projekt i obijać się od pytania do pytania na StackOverflow? Kupić książkę? Wejść na YouTube i poszukać czegoś o Go (btw, wyszukiwanego jako Golang)?

Przez to, że cały eksperyment z Go to dla mnie nic zobowiązującego, to zamiast przykładów postanowiłem pobieżnie zapoznać się z teorią która stoi za tym językiem – pokażcie mi na czym ten Go właściwie polega.

W tym celu na kilka godzin zagłębiłem się w oficjalny interaktywny tutorial – A Tour of Go:

Tutorial jest napisany w bardzo przystępny dla nowych programistów sposób. Zaczynamy od absolutnych podstaw takich jak typy i funkcje, robimy ćwiczenia z instrukcji warunkowych, a kończymy na wielowątkowości. Po kilku godzinach z małymi przerwami jesteśmy już w stanie pisać proste skrypty operujące na plikach czy realizujące proste operacje wielowątkowe.

Co ciekawego w Go?

Skoro zdecydowałem się na napisanie tego posta to łatwo się domyślić, że Go mnie po prostu zaciekawił.

Czytając i wykonując ćwiczenia z “A Tour of Go” w wielu momentach uśmiechnąłem się pod nosem na widok rozwiązań które zaimplementowano w tym języku. Nawet w najprostszych instrukcjach można znaleźć coś, co chciało by się zobaczyć w innych językach z którymi pracuję na co dzień.

Kilka najciekawszych wg mnie przykładów wybrałem i opisałem dla was poniżej.

Jedna pętla – for

W Go pętlą for można zrealizować kilka pętli znanych z innych języków:

If

W podstawowej instrukcji warunkowej można za jednym zamachem stworzyć zmienną i sprawdzić na niej warunek:

Switch

W przypadku instrukcji switch program wykonuje tylko jeden pasujący blok casenie przeskakuje do kolejnych. Jeśli chcesz, żeby to zrobił, musisz w jawny sposób na koniec danego “kejsa” dodać instrukcję fallthrough.

Logiczne. Bez niespodzianek. Lubię to.

Lekkie OOP

Programowanie obiektowe w Go realizowane jest w dość specyficzny sposób, ponieważ… nie ma tam klas. Są za to struktury i typy, które mogą otrzymywać dodatkowe metody poprzez mechanizm przypominający extension methods znane np. z C#:

Praca na strukturach wygląda podobnie:

Przede wszystkim prostota.

Lekkie OOP widać też chociażby w pracy z interfejsami, które Go posiada – dany typ nie musi być jawnie zadeklarowany jako implements XYZ żeby implementować dany interfejs. Wystarczy, że będzie spełniał “przepis” na ten interfejs, czyli np. posiadał wszystkie wymagane metody. W ten sposób nie musimy modyfikować typów i struktur z paczek które nie należą do nas, a które mogłyby spełniać wymagania danego interfejsu. Jeśli spełniają, to bez jakiejkolwiek modyfikacji i robienia adapterów po prostu wszystko zadziała.

Wielowątkowość – channels & goroutines

Temat rzeka – dla wielu killer feature tego języka. Co prawda nie wgryzałem się jeszcze zbyt dokładnie co siedzi pod spodem tego co zaraz zobaczycie, ale prostota z jaką zaimplementowano wielowątkowość w tym języku naprawdę robi wrażenie.

Czego efektem jest:

Koncepty goroutines i channels przypadną do gustu wszystkim tym, dla których wielowątkowość była zawsze potworem nie do ogarnięcia. Go, jako język projektowany z myślą o programowaniu systemów, dostarcza wiele tego typu rozwiązań out-of-the-box. Podobnie intuicyjnie rozwiązany jest chociażby dostęp do zasobów współdzielonych – okazuje się, że od mutexów głowa wcale nie musi boleć 🙂

 

Nie wszystkie konstrukcje w Go przypadną Wam jednak od razu do gustu. Pierwszym z brzegu “przerażającym” ficzerem są chociażby wskaźniki. Trzeba pamiętać, że Go to język zdecydowanie niższego poziomu niż JavaScript, C# czy Java. Inne są też jego zastosowania. Na szczęście posługiwanie się wskaźnikami w Go nie przypomina C++98 i konstrukcji spędzających sen z powiek studentom informatyki. Wskaźniki w Go da się po prostu przeżyć.

Podobnie będzie też z brakiem klas czy funkcjami zwracającymi kilka rezultatów jednocześnie – Go, jako język zaprojektowany od zera posiada pewne specyficzne dla siebie konstrukcje które przede wszystkim miały pasować twórcom. Oni sami tak piszą o tym języku:

Go is a programming language designed by Google to help solve Google’s problems, and Google has big problems.

Go’s purpose is therefore not to do research into programming language design; it is to improve the working environment for its designers and their coworkers. Go is more about software engineering than programming language research. Or to rephrase, it is about language design in the service of software engineering.

Nic dodać, nic ująć.

Dokumentacja nie psuje dobrego wrażenia

Na koniec o jeszcze jednej kwestii która często potrafi zepsuć dobre pierwsze wrażenie związane z wybraną technologią – mowa tutaj o dokumentacji.

Chciałbym, żeby wszystkie języki z którymi się spotkałem miały tak dobrą dokumentację jak ta którą ma Go. Specyfikacja języka i jego biblioteki standardowej jest bardzo dokładnie opisana – przez ostatnie kilka dni miałem dopiero jeden czy dwa momenty, kiedy chcąc dowiedzieć się czegoś więcej użyłem wyszukiwarki Google. A to wynika tylko z mojej ciekawości – wszystko to, czego potrzebuje początkujący programista Go znajduje się na oficjalnej stronie tego języka.

Strona główna docsów znajduje się tutaj – https://golang.org/doc/. Znajdziecie tam już wspominane instrukcje dotyczące instalacji i konfiguracji środowiska, tutorial “A Tour of Go”, tutoriale autorów z innych stron dotyczące Go czy chociażby Wiki.

Z dokumentacji szczególnie polecam jednak trzy strony:

  • FAQ – wyczerpująca lista pytań i odpowiedź, gdzie znajdziecie wyjaśnienia wszystkich kwestii które interesują szczególnie tych bardziej doświadczonych programistów – co siedzi pod spodem, dlaczego zaimplementowano X, dlaczego brakuje Y – to wszystko tam jest i na was czeka
  • Effective Go – oficjalne guidelines’y – jak pisać kod wg dobrych praktyk, czego unikać, na co zwracać uwagę – prawdziwa ściąga z dobrego Go
  • Go at Google – jakie problemy stara się rozwiązać Go i co stoi za jego powstaniem

Co dalej?

Przez mocne zaangażowanie we front-end nie chcę i nie mogę teraz rzucić wszystkiego i postawić na Go. Wiem jednak, że w wolnych chwilach będę jeszcze nie raz wracał do tego języka.

Odświeżenie mojej programistycznej głowy zakończyło się powodzeniem – zobaczyłem język z konkretnie opisanymi założeniami, którego składnia i sposób działania oddają to, o czym twórcy piszą w dokumentacji. Dokumentacji, która jest naprawdę dobra, spójna i obszerna. Na pewno rozważę wybór Go jeśli przyjdzie mi kiedyś pobawić się w microservice’y czy tworzyć narzędzia automatyzujące moją pracę. Patrzę na Go jak na takiego lepszego C++ z którym mógłbym wytrzymać w jednym pokoju – odpowiednio szybki, multiplatformowy, z przyjazną dla programisty składnią i łatwością tworzenia kodu, a także sprzątający za mnie (Go posiada wbudowany GC).

Nauka z opisywanego weekendu i kilku kolejnych dni jest jednak taka – świat poza JavaScriptem istnieje i zdecydowanie warto się nim zainteresować. A jakie jest wasze zdanie – chcielibyście zobaczyć więcej Go na naszej stronie?

Powiązane

Jak było na tegorocznym Ng-Poland? Konferencje i meetupy programistyczne to jedna z najprzyjemniejszych części życia programisty. W ich trakcie możesz nie tylko poznać najnowsze technol...
Aplikacje mobilne – jak zacząć Zaczynając naukę programowania stoi przed Tobą wiele wyborów. Ten, który najbardziej wszystkich trapi to wybór języka programowania. Decyzja ta jest m...
Strategy design pattern – real life example Today I’ll show you a quite nice example of the Strategy pattern from a real project I was working on some time ago. First, let’s check out a textb...
Code review i pierwsza praca programisty Code review. Gwarantuję Ci, że są to dwa słowa, z którymi na pewno spotkasz się w swojej pierwszej pracy, na stażu, czy praktyce zawodowej. Czym jest ...