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
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?