PR0GRAMISTA
Golang

Swojego ukochanego języka szukam już kilka lat. Najpierw zakochałem się w Javie, później w Pythonie a teraz w Go?

Trochę historii

Go jest młodym językiem, bo został stworzony w 2007, ale dopiero w 2009 został ogłoszony. Dla porównania Java pojawiła się w 1995. Go ma swoje początki w Google, co owocuje dużym wsparciem dla języka. Go jest językiem dynamicznym, silnym, kompilowanym z zarządzaniem pamięcią.

Jaki jest Go?

Dobrze prymitywny

Coś co najpierw mnie zdziwiło, ale da się to zrozumieć w kontekście Google. Składnia Go jest prymitywna, choć też ma swoje skróty. Pętle for zamiast streamów itp. Dlaczego tak zrobiono? Jedną z przyczyn podaje się to co się stało z C++, gdzie ilość możliwości zrobienia czegoś jest tak wielka, że brakuje pewnego naturalnego standardu. W Go większość rzeczy można zrobić dobrze na jeden sposób. To ma zapobiec istnieniu różnych stylów kodu, co jest trudne, gdy zatrudnia się tak wiele osób.

Wielowątkowość

Twórcy Go zauważyli, że taktowanie procesorów nie zwiększa się już tak drastycznie, ale dodanie większej ilości rdzeni już nie stanowi dla nas takiego problemu, dlatego jedną z ciekawszych cech Go to jego wsparcie dla operacji wielowątkowych. To brzmi głupio, więc powiem to inaczej: jeszcze nigdy nie chciałem tak często korzystać z wielu wątków jak przy Go. To jest tak proste i satysfakcjonujące.

// Kanał - łatwa komunikacja między wątkami
userChannel := make(chan []User)

// Pobieram 10 stron z listą użytkowników
for i := 1; i < 10; i++ {
  go getUsers(userChannel, i) // Polecenie go uruchamia nowy wątek
}

// 10 zapytań leci równolegle a nie po kolei

for i := 1; i < 10; i++ {
  // Czekam na odpowiedzi
  users := <-userChannel
  fmt.Printf("Returned %d users\n", len(users))

  for _, user := range users {
    // Coś tam robię
  }
}

Warto dodać, że wątki Go nie jest typowymi wątkami, są to tak naprawdę Goroutines czyli lekkie wątki zarządzane przez Go a nie przez system.

Brak dziedziczenia

Go nie ma mechanizmu dziedziczenia. Kiedyś powiedziałbym, że to jest głupie, bo przecież dziedziczenie jest cudowne, ale dziś znam też i ciemną stronę. Spring przyzwyczaił mnie do szukania implementacji przodka implementującego interfejs Y klasy X. Chyba już rozumiecie. Płaska struktura nie jest najlepsza, ale na pewno lepsza od spagetti po pięknym dziedziczeniu.

Biblioteki

Jak już kiedyś wspominałem Python ze swoim poleceniem pip sprawia, że instalacja bibliotek jest banalna. Golang robi to jeszcze lepiej zarówno od strony twórców bibliotek jak i ich użytkowników. Jak się to robi? Pokażę na przykładzie uiprogress: go get github.com/gosuri/uiprogress. Zamiast jakiejś wymyślonej nazwy podajemy link do GitHuba i tyle. Później w kodzie używamy import "github.com/gosuri/uiprogress" i tyle!

A co do liczby bibliotek --- jest ona spora i dalej się powiększa, ale są jeszcze pewne braki, standardy. Bardzo przydatna lista bibliotek do Go jest dostępna tutaj jako Awesome Go

Maskotką Go jest suseł w różnych formach, kolorach

Go jest łatwy w nauce

Go Tour to wszystko co potrzebujecie aby poznać język. GoDoc generuje dokumentacje dla repozytoriów Go. Strukture projektu Go opisuje dokumentacja. Narzucanie czegoś z góry jest w tym przypadku dobre, bo tworzy ładną krzywą uczenia się.

Go jest szybki

Go jest ciągle optymalizowany, są nawet narzędzia do benchmarków. Zmiany czasem widać z wersji na wersję i tak Go wypada lepiej w benchmarkach niż Java, bazując na Benchmarks Game. Nie dość, że jest szybszy to jeszcze zużywa mniej pamięci. Oczywiście nie ma on większych szans z C i C++, ale na tle innych języków wypada naprawdę dobrze.

Go się kompiluje

Po kompilacji Go otrzymujemy jeden plik, który możemy uruchomić bez żadnych zależności. Tak, nie trzeba nic instalować na serwerach. Kompilowanie do natywnego kodu ma jednak swoje wady, które Go sprytnie rozwiązał. Na przykład, jeśli programujemy na Windowsie 64-bitowym a chcemy otrzymać program na 32-bitowego Linuxa to jedyne co musimy zrobić dla Go to ustawić odpowiednie zmienne środowiskowe.

Otwieramy konsolę i wpisujemy set GOOS=linux i wybieramy architekturę przez set GOARCH=386 i kompilujemy przez go build. Tak samo możemy sobie poradzić z programami na macOS czy FreeBSD.

Listę dostępnych systemów i architektur możemy zobaczyć na golang.org/doc/install/source. Go obsługuje też ARMy, yay!

EOF

Go jest świetnym językiem z równie dobrym ekosystemem. JavaScript mógłby się czegoś nauczyć. Według mnie aktualnym problemem Go jest brak frameworków out-of-the-box, takich jak django. Go nie ma najlepszego zastosowania do gier czy obliczeń naukowych. Aktualnie najlepiej się sprawdza jako część aplikacji biznesowej lub w zarządzaniu systemami. Go trafia też powoli na platformy IoT. Ciekawy język, ale czy znajdziecie dla niego miejsce?

07 czerwca 2017
dsp2017 go