Blog

Golang dla Hobbystów. Instrukcje warunkowe

W trzeciej odsłonie cyklu poświęconego GO przyjrzymy się instrukcjom warunkowym.

Golang dla Hobbystów. Instrukcje warunkowe

Mając na uwadze to, co obecnie dzieje się za naszą wschodnią granicę, nie za bardzo mam ochotę na cokolwiek poza trzymaniem kciuków za dzielny naród ukraiński. Tym niemniej śledzie radia, telewizji oraz internetów nie wpływa dobrze na mój stan mentalny, dlatego postanowiłem w trybie ekspresowym popełnić kolejny tekst GO dotyczący. Przy okazji jednakże przemyślałem założenia tego cyklu, zwłaszcza że ostatni wpis poszedł w kierunku, który zupełnie mi nie odpowiada. Nie chcę by był to “pełnoprawny” kurs dla początkujących programistów, co zazwyczaj leżało u podstaw każdego mojego tekstu (abstrahując oczywiście od praktycznej realizacji tego celu). Tym bardziej, że nie jestem przekonany, że GO to najlepszy język na początek przygody z kodowanie z wielu powodów.

Dlatego postanowiłem odrobinę przedefiniować założenia niniejszego cyklu, który chciałbym uczynić czymś w rodzaju mniej lub bardziej pożytecznego bryka czy raczej punkt zaczepienia dla osób, które dopiero zastanawiają się, czy poświęcić czas i energię na rozpoczęcie przygody z GO. Stąd w miejsce szczegółowego omawiania takich czy innych elementów koderskiego rzemiosła przy użyciu narzędzi w GO dostępnych, będę po prostu krótko prezentował podstawowe struktury bez wchodzenia w detale, o ile nie jest to coś nowego patrząc z perspektywy osoby, która amatorsko programuje w językach skryptowych (ze szczególnym uwzględnieniem Pythona).

Tyle jeśli chodzi o dzisiejsze oświadczenie i teraz pora zająć się konkretami.

Instrukcja warunkowa if …else

W przypadku GO podstawowa instrukcja warunkowa nie powinna nastręczać większych problemów komukolwiek. Jej ogólna struktura wygląda następująco:

if warunek1 {

blok kodu

} else if warunek2 {

blok kodu

} else {

blok kodu

}

Czyli na początku mamy słowo kluczowe if, po którym następuje podanie warunku do sprawdzenia, a dalej mamy nawias klamrowy, który stanowi początek bloku warunkowego, czyli kodu wykonywanego, jeśli zachodzi dany scenariusz (warunek zwraca wartość true). Całość zamyka drugi nawias klamrowy.

Oczywiście w GO jak większość innych języków jest dodana możliwość obsługi rozgałęzień w instrukcjach warunkowych. Służą do tego instrukcje else if oraz else.Te dwie ostatnie są rzecz jasna opcjonalne. Jeśli jednak jest kilka ścieżek do rozważenia, możesz użyć kolejnych bloków else if tyle razy, ile potrzeba oraz je zagnieżdżać.

Instrukcja switch

Instrukcja switch jest znacznie ciekawszą - z mojej perspektywy rzecz jasna - konstrukcją w podejściu do sterowania przepływem. Switch jest powszechnie używany do opisywania działań podejmowanych przez program, gdy zmienna ma przypisane określone wartości.

Innymi słowy: używa się jej gdy chcemy na podstawie wartości jakiegoś wyrażenia wykonywać jedną z kilku operacji. Rzecz jasna to samo może osiągnąć przy pomocy instrukcjami if oraz else, ale dzieje się to nierzadko kosztem czytelności kodu. Instrukcja switch to bardziej wydajny (krótszy) sposób na dokonywanie właśnie takich wyborów, która przy okazji może wyraźnie poprawić czytelność naszego kodu.

Mi to rozwiązanie trochę przypomina konstrukcję case dla PL/SQL, choć bardziej poziomie zapisu niż faktycznego działania. Jej użycie rozpoczynamy od zapisania słowa kluczowego switch, a następnie wyrażenie warunkowe. Potem umieszczanych jest kilka wyrażeń case, każde z możliwą wartością wyrażenia warunkowego. Wybierane jest pierwsze wyrażenie case, którego wartość pasuje do wyrażenia warunkowego. Kod tego wyrażenia case jest wykonywany, natomiast pozostałe wyrażenia case są ignorowane. Możesz też dodać instrukcję default, uruchamianą, jeśli żadne z wyrażeń case nie zostanie dopasowane.

Poniżej jest przykład kodu, w którym sprawdzana jest wartość przypisana do zmiennej operatingSystem i w zależności od tego jaką wartość ona zwraca wyświetlane są różne komunikaty:

switch operatingSystem {
case "darwin":
fmt.Println("Mac OS Hipster")
case "linux":
fmt.Println("Linux Geek")
default:
// Windows, BSD, ...
fmt.Println("Użytkownik Niszowych Systemów")
}

Warto wspomnieć, że ramach jednego wyrażenia case można porównywać kilka wartości na raz. Wówczas wystarczy je rozdzielić przecinkiem, tak jak w przykładzie niżej:

switch operatingSystem {
case "darwin":
fmt.Println("Mac OS Hipster")
case "linux":
fmt.Println("Linux Geek")
default:
case “Windows”, “BSD”
fmt.Println("Użytkownik Niszowych Systemów")
}


Inną ciekawą cechą instrukcji switch jest słowo kluczowe fallthrough, które powoduje wykonanie następnego rozgałęzienia case, co demonstruje kolejny - nie najmądrzejszy - przykład.

var operatingSystem = "linux"
switch {
case operatingSystem == "darwin":
fmt.Println("Złota klatka od Sadowników")
case operatingSystem == "linux":
fmt.Println("Pingwin rządzi")
fallthrough
case operatingSystem == windows":
fmt.Println(“Dobre okna to wyłącznie te montowane we framugach”)
}

W efekcie wykonania tego kodu otrzymamy następujący wynik:
Pingwin rządzi

Dobre okna to wyłącznie te montowane we framugach

I to byłoby tyle na dzisiaj. W kolejnym wpisie będzie o pętlach.