Programowanie w GO dla początkujących

programowanie w go dla początkujących

Golang, czy też GO to stosunkowo młody (na rynku obecny około 10 lat) język programowania, który podbija serca inżynierów w Dolinie Krzemowej. Ja zawodowo piszę w GO od ponad 2 lat i bardzo szybko stał się on moim ulubionym językiem programowania! W tym wpisie przybliżę Ci zalety tego języka, przeprowadzę Cię przez podstawy składni, dokumentację i tutoriale i wspólnie napiszemy program rozwiązujący zadanie ze strony Project Euler! Mam nadzieję, że sprawi Ci to frajdę i – kto wie – tak jak ja, staniesz się fanką Go! 


GO – co go wyróżnia?

Golang to open-sourcowy język programowania, który charakteryzuje się prostotą składni (co mocno ułatwia jego naukę), ale też dużą wydajnością (dzięki czemu programy pisane w GO mają szerokie zastosowanie na tzw. ‘backendzie’). Jego wersja 1.0 miała swoją publiczną premierę w 2012. 


Jakie zalety ma język programowania GO?

Do zalet GO na pewno można zaliczyć:

  • prosta składnia;
  • garbage collector, dzięki czemu nie trzeba (za bardzo) zaprzątać sobie głowy zwalnianiem wykorzystanej pamięci;
  • dobre praktyki programistyczne, które są wręcz “wbudowane” w język (np. nazewnictwo struktur i funkcji jest ujednolicone, i te dostępne publicznie zawsze zaczynają się dużą literą; kompilator wyrzuci błąd, jeśli dany program importuje nieużywane pakiety; Go dostarcza też rozwiązanie ujednolicające styl, raz na zawsze kończąc odwieczną debatę – jakie wcięcia robić w kodzie?).

Ze względu na prostotę składni, nie ma wbudowanych funkcji, typowych dla np. pythona, które “ukrywają” faktyczny koszt wykonania danej operacji. Zmusza to niejako programistów do zastanowienia się nad wydajnością swojego kodu już w momencie jego pisania – co dla mnie jest ogromnym plusem!



No i chyba najistotniejsze: dzięki tzw. goroutines GO mocno ułatwia i wspiera programowanie wielowątkowe*.



Golang – zastosowanie

Dzięki swojej wydajności, prostocie, i wszystkim wyżej wymienionym zaletom, Go znalazł szerokie zastosowanie w branży. Najczęściej są to systemy tworzone w architekturze mikroserwisów – tzn. system, który składa się z kilku mniejszych aplikacji, z których każda odpowiedzialna jest za niewielką część większego systemu. Ponadto, Golang świetnie sprawdza się w aplikacjach serwerowych oraz przy budowaniu wszelkiego rodzaju API, czy też parsowaniu przeróżnych danych (JSON? XML? yaml? – nie ma sprawy!).
Zgodnie z ankietą przeprowadzoną przez serwis StackOverflow – jest to też jeden z lepiej opłacanych języków programowania.
Jeśli więc jeszcze nie miałaś styczności z tym językiem, Programistko, to może być dobry moment, by wreszcie spróbować! ?


Jak zacząć naukę programowania w Go?

Na początek, zacznijmy od składni i dokumentacji…

Być może znasz już moje wcześniejsze teksty i czytałaś o tym, że dokumentację uważam za bardzo istotną część projektu. Go w tym wypadku nie wypadł sroce spod ogona i dostarcza użytkownikom bardzo jasną dokumentację wraz z przykładami użycia i tutorialami. To właśnie na podstawie tutorialu opublikowanego na głównej stronie języka uczyłam się w nim programować.


Jeśli szukasz innych materiałów, warto sprawdzić też Golang-book – stronę, na której znajdziesz darmową książkę wprowadzającą do programowania w GO, darmowy, 4-tygodniowy bootcamp z materiałami video dostępnymi na Youtube oraz poradnik dotyczący programowania współbieżnego w tym języku. 


Krótki przegląd składni języka GO

Zamiast rozpisywać się po kolei nad tym, jak w Go oznacza się typy zmiennych, funkcje, struktury i jakie są rozwiązania alternatywne – omówmy to wszystko na przykładzie!

package main
import (
        "fmt"
)

func main() {
        fmt.Println("Hello World!")
}


Powyższy program po uruchomieniu wypisze w konsoli frazę “Hello World!”. Co oznaczają kolejne elementy?

package main w linii pierwszej określa nazwę paczki. Każdy program czy biblioteka w Go to właśnie taka “paczka”. Wykonywanie programu zawsze rozpoczyna się od main. W części import (linie 2-4) deklarujemy, z jakich innych paczek nasz program będzie korzystać. W tym wypadku jest to fmt, czyli pakiet usprawniający formatowanie wprowadzonych i wypisywanych danych.

W linii 6. mamy do czynienia z jedyną funkcją, main, która nie przyjmuje żadnych argumentów, ani nie zwraca żadnego wyniku. Ciało funkcji zawiera się między {  a } i w tym wypadku mieści się tylko w jednej linijce – 7., gdzie wywołujemy publiczną funkcję Println z pakietu fmt podając argument “Hello World!”.


Z jakich narzędzi warto korzystać?

Aby zacząć programować w GO, będziesz potrzebowała kompilatora – instrukcję instalacji wraz z plikami do pobrania na wybrany system operacyjny znajdziesz tutaj. Programy w Go możesz pisać w dowolnym edytorze tekstowym (ja korzystam z ViMa, ale jeśli dopiero zaczynasz, VSCode może okazać się lepszym wyborem). 


Warto również zaprzyjaźnić się z gofmt – narzędziem, które ujednolici formatowanie w Twoim kodzie, dzięki czemu będzie on łatwiejszy do czytania i późniejszego przyswojenia przez innych programistów.


Jeśli jednak nie chcesz bawić się w instalowanie tego wszystkiego, a chcesz po prostu sprawdzić, czy pisanie kodu w Go jest dla Ciebie – polecam odpalić Go Playground, czyli edytor kodu online dedykowany Go, gdzie z łatwością napiszesz, uruchomisz i udostępnisz swój pierwszy program w Go!


Twój pierwszy program w GO!

Na początku tego tekstu obiecałam Ci, że zakończymy go z napisanym rozwiązaniem jednego z zadań z projektu Euler. Weźmy więc na tapet pierwsze zadanie z brzegu: Suma wielokrotności cyfry 3 i 5.


Zgodnie z treścią – chcemy policzyć sumę wszystkich takich liczb mniejszych od 1000, które są wielokrotnością cyfry 3 lub 5. Do rozwiązania tego zadania można podejść na kilka sposobów – zacznijmy jednak od najprostszego…


Rozwiązanie 1: Najprostsze, choć mniej wydajne

Całe rozwiązanie zobaczysz na Go Playground.


Żeby rozwiązać to zadanie, wystarczy, że dla każdej liczby mniejszej od 1000 sprawdzimy, czy jest podzielna przez 3 lub 5. Napiszmy więc program, który sprawdzi po kolei każdą taką liczbę i – jeśli okaże się, że spełnia żądany warunek – doda ją do ogólnej sumy.


Zacznijmy od zdefiniowania stałej. W Go możemy zadeklarować stałą w dowolnym miejscu programu, ale w dobrym stylu jest zadeklarowanie całej sekcji stałych, jak niżej:

const (  
  MAX = 1000
)


Potrzebna jest też funkcja main, w której wykona się program:

func main() {
  // zamiast tego komentarza będzie logika naszego programu
}

Zacznijmy od zdefiniowania pierwszych zmiennych:

func main() {
  sum := 0 // suma wszystkich liczb spełaniających warunek  
  i := 0 // kolejna sprawdzana liczba
}


Program ma sprawdzić warunek dla wszystkich liczb z przedziału od 0 do 999 (tak naprawdę, to od 3, ale nie robi to już takiej różnicy). Potrzebna jest zatem pętla. W Go taka pętla nazywa się for i w tym wypadku będzie ona wykonywać swoją zawartość, dopóki warunek jest prawdziwy. Ponieważ chcemy sprawdzić wszystkie możliwe wartości i  mniejsze od 1000, naszym warunkiem jest i < 1000. Całość możemy zapisać w sposób następujący:

func main() {
  sum := 0  
  i := 0  
  for i < MAX {    
     // tu będzie zawartość pętli  
  }
}


Zwróć uwagę, że gdybyś już teraz uruchomiła program w Go Playground, po chwili na dole wyświetliłby się czerwony komunikat informujący o błędzie. Timeout, w szczególności. Chodzi o to, że w programie – przynajmniej na razie – wartością i jest zawsze 0, a zatem i jest zawsze mniejsze od 1000! Stąd potrzebujemy zwiększyć wartość i o 1:


func main() {
  sum := 0
  i := 0
  for i < MAX {
    // tu będzie zawartość pętli
    i += 1
  }
}


Na koniec chcemy sprawdzić, czy i jest podzielne przez 3 lub 5 i dodać tę liczbę do sumy, jeśli spełnia tę zależność. Z pomocą przychodzi nam if. If podobnie jak for w tym wypadku wymaga od nas warunku do spełnienia. Jeśli chcemy sprawdzić, czy liczba i jest podzielna przez 3, możemy zapisać ten warunek następująco: i % 3 == 0, gdzie % oznacza, że dzielimy i przez 3 z resztą i to właśnie tę resztę porównujemy do 0. Jeśli i dzieli się przez 3 bez reszty, to znaczy, że spełnia ona nasz warunek! Mamy więc:


func main() {
  sum := 0
  i := 0
  for i < MAX {
    if i % 3 == 0 {
      sum += i
    }
    i += 1
  }
}


Co w takim razie z cyfrą 5? Dodatkowy warunek możemy zapisać na kilka sposobów: 

  • możemy użyć słowa kluczowego else, które oznacza mniej więcej tyle, że jeśli pierwszy warunek nie był spełniony, to należy wykonać inny kod;
  • możemy wykonać jeszcze jeden if pod tym pierwszym – zwróć jednak uwagę, że przy takim zapisie Twój program może podać błędne rozwiązanie i podwójnie zliczać liczby podzielne zarówno przez 3, jak i 5;
  • wreszcie możemy po prostu powiedzieć “lub”, tzn. wykonać pewien kawałek kodu jeśli warunek1 lub warunek2 jest prawdziwy!

Skorzystajmy więc z 3 opcji! ? “Lub” w Go oznacza się przy pomocy ||:


func main() {
  sum := 0
  i := 0
  for i < MAX {
    if i % 3 == 0 || i % 5 == 0{
      sum += i
    }
    i += 1
  }
}


Na zakończenie, chcemy też wypisać wynik, podobnie jak we wcześniejszym programie “Hello World!”.


Oczekiwany wynik działania programu to 233168.


Rozwiązanie 2: Dla tych lubiących matematykę! [Ciekawostka]

Powyższe, pierwsze rozwiązanie tego zadania miało na celu jeszcze bardziej przybliżyć Ci składnię języka Go i pomóc Ci zacząć . Jeśli jednak lubiłaś matematykę w szkole, być może coś Ci świta, że to zadanie wcale nie wymaga tych wszystkich pętli… a wynik ten, w gruncie rzeczy, można policzyć na kartce


To zadanie to nic innego jak obliczenie odpowiedniej sumy ciągu arytmetycznego


Takie rozwiązanie dla tych konkretnych danych można zapisać jako:

SumaCiągu3 + SumaCiągu5 - SumaCiągu15

Odejmowanie SumaCiągu15 wynika z tego, że dodając do siebie osobne dwa ciągi – 3 i 5 – niektóre liczby zliczamy dwukrotnie (podobnie jak w wypadku użycia dwóch ifów w rozwiązaniu 1). 


Powyższe rozwiązanie przedstawiam bardzo krótko, głównie jako ciekawostkę, ponieważ wykonywane tu obliczenia sprawiają, że czas wykonywania takiego programu byłby znacznie krótszy niż w przypadku rozwiązania 1. Może Ci się to kiedyś przydać w trakcie rozmowy rekrutacyjnej na stanowisko programistki (serio, serio!). Jest ono jednak trochę mniej ciekawe z punktu widzenia programowania w Go. ?

Podsumowanie

Golang jest stosunkowo nowym językiem, który dość szybko podbił serca wielu programistów i firm technologicznych. A dzięki jego szerokim zastosowaniom i rosnącej popularności, a także wysokiej płacy – jest to język, którego moim zdaniem warto się uczyć!


Jeśli przebrnęłaś wraz ze mną przez cały tekst, masz już za sobą swój pierwszy program w Golang – daj znać w komentarzu, czy tego typu poradnik przypadł Ci do gustu! Chętnie podzielę się z Tobą również opisami innymi języków programowania, w których pisałam (bądź piszę) w trakcie swojej kariery programistycznej!


Programowania najlepiej uczyć się rozwiązując zadania bądź też tworząc swój własny (nawet nieduży) projekt i na bieżąco uzupełniając wiedzę. Jeśli jednak tak jak ja lubisz uczyć się też od innych i chciałabyś móc usłyszeć o początkach kariery Super Programistek, a także zadać na żywo pytanie o naukę, karierę, języki programowania, czy cokolwiek innego – już dziś zapisz się na nasz #1 Meetup Super Programistek, który odbędzie się w Dzień Kobiet, 8 marca 2021, o 19:00(czasu polskiego). Więcej informacji o wydarzeniu i RSVP znajdziesz na stronie Meetupu!


*programowanie wielowątkowe – tak jak Ty czasem oglądasz telewizję, jednocześnie odpisując na SMSa, czy sprawdzając Facebooka; tak i Twój program może wykonywać kilka czynności “na raz”, współbieżnie. Programowanie wielowątkowe to jedna z metod osiągnięcia tego celu.