Golang staje się coraz bardziej popularny. Kusi szybkością, prostotą składni oraz skalowalnością. To plusy, koło których bez wątpienia nie można przejść obojętnie.
Jestem Bartek i zajmuję się programowaniem od prawie 10 lat. Bloguję oraz organizuję Meetup w Krakowie na temat golang. W tym kursie przybliżę Wam składnię języka oraz niektóre mechaniki działające pod spodem, a także pokażę, jak się z niego korzysta w prawdziwych aplikacjach, nie tylko w tutorialach. Zanim jednak przejdziemy do samego języka, porozmawiajmy o jego zastosowaniu.
Zastosowanie
Golang jest kompilowanym językiem programowania. To znaczy, że nie posiada żadnego interpretera – tak jak PHP, Python czy Ruby – oraz nie działa na wirtualnej maszynie jak C# czy Java. Kompiluje się go do języka maszynowego, co pozwala osiągnąć bardzo dużą wydajność. W przeciwieństwie do C oraz C++, które też są kompilowane, golang wyróżnia się tym, że posiada Garbage Collector (GC).
Garbage Collector to (w wielkim skrócie) metoda automatycznego zarządzania dynamicznie przydzielaną pamięcią. Dzięki temu nie musimy myśleć o zwalnianiu pamięci za każdym razem, gdy tworzymy nową zmienną dynamicznie. Pomaga to w uniknięciu – często bardzo trudnych do znalezienia – wycieków pamięci. Możemy więc zapomnieć o takim kodzie jak poniżej:
int *p = new int; float *r = new float(75.25); int *q = new int[n]; // freed the allocated memory delete p; delete r; // freed the block of allocated memory delete[] q;
(Więcej o Garbage Collectorze posłuchasz w tym odcinku podcastu DevTalk).
Gdzie golang sprawdza się najlepiej? Bez wątpienia jego mocną stroną są zastosowania w infrastrukturze. Coraz więcej aplikacji mających za cel wspomaganie infrastruktury bądź programistów jest pisanych właśnie za pomocą tego języka. Przykładem może być choćby Docker.
Instalacja oraz IDE
Instalacja kompilatora jest stosunkowo prosta. Na systemach z rodziny Linux/Unix wystarczy skorzystać z managera zależności.
brew install go #macOS apt install golang #ubuntu
W przypadku środowiska Windows trzeba wykonać kilka kroków:
- pobrać instalator ze strony https://golang.org/dl/,
- dokonać instalacji, postępując zgodnie z instrukcjami,
- stworzyć folder, w którym będą umieszczane aplikacje. Może to być np. C:\Projects\Go,
- ustawić zmienną środowiskową GOPATH, tak aby wskazywała na ten właśnie folder.
Jako edytor polecam GoLand, Sublime Text bądź Atom. Oczywiście każdy inny program, który pozwala edytować pliki w kodowaniu UTF-8, się sprawdzi, jednak największą wygodę oferuje IDE od IntelliJ.
Pierwsze kroki
Zaczniemy od stworzenia katalogu z projektem. Folder ten powinien znajdować się wewnątrz $GOPATH/src. Oczywiście proste przykłady będą działać w każdym innym miejscu, lecz niektóre managery zależności mogą wtedy nie funkcjonować. Stwórzmy więc nowy folder $GOPATH/src/gocourse/first, a następnie plik main.go.
Pierwszy program
Umieść w pliku main.go zawartość listingu poniżej. Omówimy teraz pokrótce każdą z linijek. Linia nr 1 zawiera nazwę pakietu, w którym operujemy. Nazwaliśmy ten pakiet main, ponieważ tylko ten pakiet może zostać uruchomiony. Linia nr 3 zawiera import zewnętrznego pakietu, jakim jest fmt. Pakiet ten zawiera m.in. zestaw funkcji formatujących tekst oraz operujących na standardowym wejściu/wyjściu.
package main import "fmt" func main() { fmt.Println("Hello world, gophers!") }
Dalej znajduje się funkcja main(), od której zaczyna się wykonywanie programu. W jej wnętrzu znajdziemy tylko jedną instrukcję odpowiedzialną za wyświetlanie na standardowym wyjściu (terminalu) napisu „Hello world, gophers!”.
Uruchomienie programu
Aby uruchomić nasz program, musimy wykonać jedną z kilku operacji.
Jeżeli korzystamy z GoLand od IntelliJ, możemy po prostu kliknąć zielony trójkąt, taki jak na obrazku poniżej. W tym przypadku nasze IDE wykona za nas polecenie, które opiszę za chwilę, i wyświetli wbudowany terminal z wynikiem działania programu.
Innym sposobem jest użycie linii poleceń. I tutaj możemy wybrać jedną z dwóch dróg: zbudować aplikację i uruchomić plik binarny albo kazać kompilatorowi wykonać obie operacje za nas za jednym razem.
Budowanie jest bardzo proste – wystarczy wykonać poniższe polecenie, a naszym oczom pokaże się nowy plik o nazwie main(.exec), który możemy uruchamiać jak każdy inny program.
go build main.go ./main
Drugie polecenie wykonuje obie te operacje za jednym razem, lecz nie pozostawia po sobie pliku binarnego. Jednym słowem buduje program oraz go uruchamia w locie.
go run main.go
Podsumowanie
Gratuluję, zostałeś gopherem! Dzisiaj skonfigurowałeś swoje środowisko pracy, napisałeś pierwszy program w języku golang oraz nauczyłeś się go uruchamiać. Jak być może zauważyłeś, drogi Czytelniku, kod źródłowy przypomina trochę język C/C++. I rzeczywiście pod wieloma względami jest bardzo podobny, lecz golang ma prostszą składnię oraz zestaw mechanizmów, które ułatwiają programowanie. To właśnie one zostaną tematem kolejnych artykułów.
Więcej moich artykułów (nie tylko związanych ściśle z Go) znajdziesz na moim blogu developer20.com.
Coś się zmieniło (punkt 2 uznaje za najmniej istotny) od 2015:
https://kaushalsubedi.com/blog/2015/11/10/golang-sucks-heres-why/
?
„kod źródłowy przypomina trochę język C/C++” – to są zdecydowanie dwa języki, szczególnie w użytym kontekście. O ile użycie obiektów przypomina C++, to już definiowanie klas jest wg mnie zupełnie inne (przez co na przykład mi nie podeszło).
No to jeśli chodzi o generyki, to ich specjalnie nie było i miało to też sens. Go miał być szybki zarówno jeśli chodzi o czas wykonywania jak i czas kompilacji, a generyki potrafią to drugie wydłużyć. Binarka też wtedy szybciej puchnie. Ale twórcy Go się uginają i w golang 2.0 mają już generyki być.
Od wersji 1.11 mamy swój natywny manager pakietów, więc temat uznają za nieaktualny. Co do nazw pakietów, to już jest ro aczej opinia, niektórzy wolą jak jest teraz, niektórzy wolą w stylu javy czy innych podejść. Ale jak mówiłem – to już opinia.
Bad Forking Support – to jest sporo racji, ale pytanie – jak często się to robi? ja tej operacji dokonałem tylko 2-3 razy w życiu a odkąd pracuję w Go, to w ogóle. Poza tym istnieje coś takiego jak znajdź&zamień w IDE albo sed w konsoli :D
Co do definiowanie struktur, to też jest kwestia preferencji. Pamiętajmy, że żaden język nie jest dla każdego tak naprawdę :) to już jest raczej kwestia przyzwyczajenia/nawyków a niżeli złego/dobrego designu języka, bo można i w jednym i w drugim przypadku dojść do takiego momentu, że nasze struktury/klasy wyglądają beznadziejnie.
Kiedy można się spodziewać kolejnego odcinka?
będą się pojawiać co miesiąc :) są jakieś tematy, które szczególnie by Cię interesowały?
Wydaje mi się, że interesującym byłoby przejście przez język i zaznaczenie charakterystycznych dla niego zagadnień, obszary z odmiennym podejściem niż w innych, popularnych językach. Opisanie rzeczy, które Cię zaskoczyły, ździwiły, a może rozczarowały. Co, Twoim zdaniem, jest zrobione dobrze, a co wymaga poprawy.
Najbardziej popularne konstrukcje języka i ich zastosowania.
Mnie najbardziej interesowałoby go na serwerze. Jaki serwer wybrać, jak skonfigurować jakiś popularny framework i wystartować z prostą aplikacją.
dzięki Artur za komentarz. Spróbuję jakoś ugryźć tematy, o których mówisz, ale to później. Na razie chciałbym pokryć podstawy
Drobna uwaga – Goland to IDE od JetBrains, nie Intelij, które jest po prostu IDE od tej samej firmy – swoją drogą, darmowa wersja Intelij posiada całkiem fajną wtyczkę do Go, która pozwala na wygodną pracę – śmiało mogę polecić. ;)
Ciężko mi coś powiedzieć na temat 1 kursu – same podstawy jakby nie patrzeć. Nie zgodzę się, że na podstawie Hello World’a w Go można stwierdzić, że to język podobny do C czy C++. Koncepcje języka przypominają stare, dobre C i filozofię Unix’a jak najbardziej – ale nie sama składnia. W przeciwnym razie moglibyśmy tak powiedzieć o każdym języku. :)
ta darmowa wtyczka, o której wspominasz to jest dokładnie to samo co w GoLand, tylko przekonfigurowana :)
Oczywiście, Bartek, że podstawy są najważniejsze i powinny być na początku.
Nie byłem pewny, jak pisałem swój post, czy chciałbyś się nimi zajmować, bo wielu autorów uważa, że skoro jest A Tour of Go, to nie warto omawiać podstaw.
Będę czekał na każdy odcinek i zamierzam czytać wnikliwie.
Go jest pomijany w polskiej części internetu.
not any more! Poza tym są różnego rodzaju meetupy, które już mają fajne community, a które działają na polskim rynku jak https://www.meetup.com/Golang-Warsaw/ czy nawet https://www.meetup.com/gowroc/
ale mimo wszystko jest niszową technologią, jeszcze :)