Zacznij programowanie w Go - ebook
Zacznij programowanie w Go - ebook
Zacznij programowanie w Go to przydatne wprowadzenie do podstaw i zasad języka Go, które może służyć jako solidna podstawa dla kolejnych programistycznych projektów. Opanujesz składnię Go, będziesz pracować z typami i funkcjami, odkryjesz bardziej zaawansowane zagadnienia jak stan i współbieżność, po drodze rozwiązując ćwiczenia, które pomogą utrwalić to, czego się nauczyłeś.
W książce poruszono następujące zagadnienia:
• programowanie imperatywne (pętle, rozgałęzienia, zmienne)
• typy (liczby rzeczywiste, liczby całkowite, duże liczby, konwersje typów)
• funkcje i metody
• tablice mądrości, wycinki, mapy
• stan i zachowanie
• programowanie współbieżne (współbieżność, stan, gorutyny).
Książka jest przeznaczona dla osób zaznajomionych z programowaniem komputerowym oraz dla każdego, kto chce się go nauczyć.
Kategoria: | Programowanie |
Zabezpieczenie: |
Watermark
|
ISBN: | 978-83-01-21791-4 |
Rozmiar pliku: | 3,1 MB |
FRAGMENT KSIĄŻKI
_Wszystko płynie, nic nie stoi w miejscu._
Heraklit
Podczas wizyty w Europie w 2005 roku Nathan usłyszał pogłoski o nowym frameworku sieciowym o nazwie Ruby on Rails. Po powrocie do rodzinnej Alberty na Boże Narodzenie w księgarni komputerowej w centrum miasta znalazł książkę _Agile Web Development with Rails_ (wyd. Pragmatic Bookshelf, 2005). Przez następne dwa lata zmieniał swoją specjalizację z ColdFusion na Ruby.
Na uniwersytecie w York w Anglii Roger zafascynował się radykalną prostotą systemu Bell Labs Research UNIX i systemu operacyjnego Plan 9 stworzonego przez grupę naukowców, w skład której weszli późniejsi twórcy języka Go: Rob Pike i Ken Thompson. Roger stał się ich fanem, a później zajmował się systemem Inferno, który wykorzystywał własny język Limbo będący bliskim przodkiem języka Go.
W listopadzie 2009 roku język Go ogłoszono projektem o otwartym źródle. Roger natychmiast dostrzegł jego potencjał, zaczął więc z niego korzystać i współtworzyć jego standardową bibliotekę i cały ekosystem. Wciąż jest zachwycony sukcesem Go i jest zaangażowanym propagatorem tego języka oraz organizatorem lokalnego klubu miłośników.
Nathan obejrzał prezentację Roba Pike’a przedstawiającą język Go, którego jednak nie traktował poważnie aż do 2011 roku. Kiedy jego współpracownik wyraził się z uznaniem o tym języku, Nathan postanowił zapoznać się ze szkicem książki _The Go Programming Language Phrasebook_ (Addison-Wesley Professional, 2012) w trackie wakacji bożonarodzeniowych. W ciągu następnych kilku lat przeszedł od zastosowań Go w projektach hobbystycznych i blogowania na jego temat (nathany.com) do zastosowań w pracy zawodowej. Zaczął też prowadzić lokalny klub miłośników Go (edmontongo.org).
W informatyce, w której narzędzia i techniki ciągle się zmieniają i ciągle są doskonalone, nauka trwa cały czas. Niezależnie od tego, czy masz dyplom z informatyki, czy dopiero zaczynasz ją poznawać, zdobywanie nowych umiejętności jest ważną częścią tej profesji. Mamy nadzieję, że ta książka przyda Ci się podczas nauki języka programowania Go.PODZIĘKOWANIA
Możliwość napisania tej książki i pomoc w nauce języka Go były dla mnie wielkim wyróżnieniem. Dziękuję Ci za jej zakup i lekturę!
Te strony są rezultatem pracy wielu osób, nie tylko autorów, których nazwiska znalazły się na okładce.
Przede wszystkim chcielibyśmy podziękować naszym redaktorom: Jennifer Stout i Marinie Michaels za przekazanie cennych opinii i pomoc, którą od nich otrzymaliśmy. Dziękujemy również Joelowi Kotarskiemu i Mattowi Merkesowi za wnikliwą redakcję techniczną, Christopherowi Hauptowi za korektę techniczną i redaktorowi Corbinowi Collinsowi za doszlifowanie gramatyki i stylu. Dziękujemy Bertowi Batesowi oraz redaktorom serii: Danowi Maharryemu i Eleshy Hyde za rozmowy i wskazówki, które pomogły w nadaniu ostatecznego kształtu tej książce.
Chcielibyśmy podziękować Oldze Shalakhinie i Erickowi Zelayowi za wspaniałe ilustracje, Monice Kamsvaag za projekt okładki, Aprili Milne za dopracowanie naszych rysunków oraz Renée Frenchowi za obdarowanie społeczności Go pocieszną maskotką susła, która ciągle nas rozśmiesza. Specjalne podziękowania kierujemy dla Dana Allena za stworzenie narzędzia AsciiDoctor, które pomogło podczas pisania tej książki, oraz za jego nieustające wsparcie.
Ta książka nie powstałaby bez pomocy takich osób, jak: Marjan Bace, Matko Hrvatin, Mehmed Pasic, Rebecca Rinehart, Nicole Butterfield, Candace Gillhoolley, Ana Romac, Janet Vail, David Novak, Dottie Marsico, Melody Dolab, Elizabeth Martin i całej załogi z wydawnictwa Manning, która dbała o to, by trafiła ona w ręce czytelników.
Podziękowania składamy również Aleksandarowi Dragosavljevićowi za przekazanie tej książki recenzentom oraz wszystkim recenzentom za ich cenne opinie. Dziękujemy wam: Brendan Ward, Charles Kevin, Doug Sparling, Esther Tsai, Gianluigi Spagnuolo, Jeff Smith, John Guthrie, Luca Campobasso, Luis Gutierrez, Mario Carrion, Mikaël Dautrey, Nat Luengnaruemitchai, Nathan Farr, Nicholas Boers, Nicholas Land, Nitin Gode, Orlando Sánchez, Philippe Charrière, Rob Weber, Robin Percy, Steven Parr, Stuart Woodward, Tom Goodheard, Ulises Flynn i William E. Wheeler. Chcielibyśmy również podziękować wszystkim czytelnikom pierwszych wersji tej książki, którzy dzielili się swoimi opiniami na jej temat na forach.
Na koniec chcielibyśmy podziękować Michaelowi Stephensowi za zaproponowanie nam tego szalonego pomysłu, jakim było napisanie tej książki, oraz całej społeczności Go za stworzenie języka i ekosystemu, o którym z przyjemnością się nam pisze!
Nathan Youngman
Oczywiście pragnę podziękować moim rodzicom, bez których nie byłoby mnie tu dzisiaj. Rodzice od najmłodszych lat zachęcali mnie do nauki programowania, podsuwając mi książki i kierując na kursy oraz zapewniając dostęp do komputerów.
Chciałbym też podziękować Matthiasowi Stone’owi za opinie na temat wczesnych wersji roboczych tekstu oraz Terry’emu Youngmanowi za burze mózgów i pomysły. Pragnę również podziękować społeczności Edmonton Go za wsparcie oraz mojemu pracodawcy, Markowi Madsenowi, za umożliwienie zajęcia się tym projektem.
Najbardziej chcę podziękować Rogerowi Peppé za współpracę autorską. Ogromnie mi pomógł, pisząc Część 7 i popchnął ten projekt mocno do przodu.
Roger Peppé
Przede wszystkim chciałbym podziękować mojej żonie Carmen za jej wyrozumiałość i wsparcie, gdy zamiast wspólnych wycieczek w góry, musiałem pracować nad książką.
Ogromne podziękowania kieruję również do Nathana Youngmana i wydawnictwa Manning. Dziękuję im za zaufanie, które mi okazali, powierzając rolę współautora, oraz za cierpliwość na ostatnich etapach pracy nad książką.INFORMACJE O TEJ KSIĄŻCE
Dla kogo jest przeznaczona ta książka?
Go jest językiem, który przyda się programistom o szerokim zakresie umiejętności, co jest niezbędne w przypadku każdego dużego projektu. Będąc stosunkowo małym językiem, z minimalną składnią i kilkoma koncepcyjnymi ograniczeniami, Go może być kolejnym świetnym językiem dla początkujących.
Niestety, wiele zasobów do nauki Go zakłada praktyczną znajomość języka programowania w języku C. Książka _Zacznij programowanie_ _w_ _Go_ powstała więc, aby wypełnić tę lukę i umożliwić twórcom skryptów, hobbystom i nowicjuszom szybkie opanowanie podstaw języka Go. Ułatwieniem będzie możliwość uruchomienia każdego listingu i każdego ćwiczenia z tej książki na platformie Go Playground (play.golang.org), bez konieczności instalowania czegokolwiek!
Jeśli kiedykolwiek używałeś języka skryptowego, takiego jak JavaScript, Lua, PHP, Perl, Python lub Ruby, to możesz bez problemu zacząć naukę Go. Jeśli korzystałeś już z formuł w Scratchu lub w Excelu albo tworzyłeś strony w HTML-u, wybór Go jako pierwszego „prawdziwego” języka programowania będzie dobrym krokiem (zobacz film „A Beginner’s Mind” z udziałem Audrey Lim na youtu.be/fZh8uCInEfw). Oczywiście, opanowanie Go na poziomie mistrzowskim będzie wymagać cierpliwości i wysiłku, ale mamy nadzieję że ta książka będzie pomocnym źródłem informacji na początku tej drogi.
Jak zorganizowana jest ta książka?
_Zacznij programowanie_ _w_ _Go_ stopniowo wyjaśnia pojęcia potrzebne do efektywnego korzystania z języka Go i daje wiele okazji do ćwiczeń i doskonalenia umiejętności. Książka ta jest przewodnikiem po języku Go dla początkujących. Zakładamy, że czytelnicy przeczytają ją w całości, bo wiadomości podane w kolejnych lekcjach stopniowo budują wiedzę, którą chcemy przekazać. Książka ta nie ma być pełną specyfikacją języka (ta dostępna jest pod adresem: golang.org/ref/spec), ani nie ma opisywać każdego jego elementu, ale przedstawia ich większość i porusza też zaawansowane tematy, takie jak projektowanie obiektowe i współbieżność.
Nie ważne, czy chcesz tworzyć masowo _współbieżne_ usługi webowe, czy małe skrypty i proste narzędzia, książka ta pomoże ci zdobyć solidne podstawy tego języka.
- Część 1 wprowadza _zmienne_, _pętle_ i _instrukcje warunkowe_, umożliwiając tworzenie prostych programów, od powitań, po wystrzeliwanie rakiet.
- Część 2 zajmuje się _typami_ tekstowymi i numerycznymi. Nauczysz się w niej dekodować tajne wiadomości zaszyfrowane metodą ROT13, dowiesz się czegoś o katastrofie rakiety Arianne 5 i użyjesz dużych liczb do obliczenia czasu, w jakim światło dociera do galaktyki Andromedy.
- Część 3 opisuje _funkcje_ i _metody_ na przykładzie budowy fikcyjnej stacji pogodowej na Marsie odczytującej wartości z czujników i przeliczającej temperatury.
- Część 4 mówi, jak użyć _tablic_ i _map_ do terraformowania Układu Słonecznego, przeliczania temperatur i do symulacji gry w życie Conwaya.
- Część 5 wprowadza do tego jawnie nieobiektowego języka koncepcje znane z języków _obiektowych_. Opisuje, jak wykorzystywać _struktury_ i metody do nawigacji po powierzchni Marsa, jak spełniać wymagania interfejsów, aby poprawić wydajność, i jak osadzać w sobie struktury, aby tworzyć struktury bardziej złożone.
- Część 6 jest poświęcona bardziej technicznym detalom. Opisuje, jak korzystać ze _wskaźników_, które umożliwiają zmianę przekazywanych danych, aby pokonać Rycerzy, którzy mówią „nil”, i jak poradzić sobie z błędami w programie bez wywoływania paniki.
- Część 7 przedstawia prymitywy _współbieżności_ w Go umożliwiające komunikację między tysiącami uruchomionych zadań na przykładzie budowy linii produkcyjnej w fabryce obsługiwanej przez gapowate susły.
- W dodatku do książki znalazły się rozwiązania ćwiczeń, ale pamiętaj, że najciekawsze będzie ich samodzielne rozwiązanie!
Informacje o kodzie źródłowym
Kod programów został wydrukowany czcionką o stałej szerokości, aby odróżnić go od zwykłego tekstu w książce. Wiele listingów zawiera dodatkowe opisy kodu, przekazujące wiele istotnych informacji.
Kod źródłowy wszystkich listingów z tej książki możesz pobrać ze stron wydawnictwa Manning, pod adresem: www.manning.com/books/get-programming-with-go. Znajdują się tam również rozwiązania wszystkich ćwiczeń z tej książki. Jeśli wolisz przeglądać kod źródłowy online, znajdziesz go w repozytorium w serwisie GitHub, pod adresem github.com/nathany/get-programming-with-go.
Chociaż możesz kopiować i wklejać kod z serwisu GitHub, to zachęcamy jednak do samodzielnego przepisywania przykładów. Pozwoli ci to wynieść więcej z tej książki, ponieważ pisząc kod samodzielnie, nauczysz się unikania podstawowych błędów i ich poprawiania. Da ci to też więcej okazji do eksperymentowania z kodem.
Forum dyskusyjne poświęcone tej książce
Zakup książki _Zacznij programowanie_ _w_ _Go_ uprawnia do bezpłatnego dostępu do prywatnego forum internetowego prowadzonego przez wydawnictwo Manning Publications, na którym można komentować książkę, zadawać pytania techniczne, dzielić się rozwiązaniami ćwiczeń oraz uzyskać pomoc od autorów i od innych użytkowników. Aby uzyskać dostęp do tego forum i zapisać się do niego, wejdź na stronę forums.manning.com/forums/get-programming-with-go. Więcej o forach wydawnictwa Manning i obowiązujących na nich zasadach dowiesz się pod adresem: forums.manning.com/forums/about.
Wydawnictwo Manning stworzyło te fora, aby zapewnić swoim czytelnikom miejsce do prowadzenia pogłębionego dialogu z innymi czytelnikami i z autorami. Nie możemy jednak zagwarantować zaangażowania autorów, których uczestnictwo w tych forach jest dobrowolne (i nieodpłatne). Mimo to zachęcamy do zadawania autorom trudnych pytań, aby nie stracili zainteresowania tematem! Forum i archiwa starszych dyskusji będą dostępne na stronie internetowej wydawcy tak długo, jak długo książka ta będzie ukazywać się na rynku.1
Programowanie
imperatywne
Większość programów komputerowych to sekwencja kroków, takich jak opis przyrządzania gulaszu w babcinym przepisie. Program precyzyjnie mówi komputerowi, _w_ _jaki sposób_ ma wykonać określone zadanie. Zapisywanie tych instrukcji jest nazywane programowaniem _imperatywnym_. Tylko szkoda, że komputery nie umieją gotować…
W części 1 omówimy podstawy języka Go i zaczniemy naukę składni umożliwiającej wytłumaczenie komputerowi w języku Go, krok po kroku, jak coś zrobić. W kolejnych lekcjach będziemy wprowadzać stopniowo nową wiedzę, która będzie potrzebna do zmierzenia się na koniec rozdziału z pierwszym poważniejszym zadaniem – napisaniem aplikacji wyświetlającej ceny biletów na wakacje na Marsie.LEKCJA 2
PROSTY KALKULATOR
Po przeczytaniu lekcji 2:
- będziesz umiał zaprogramować wykonywanie obliczeń matematycznych
- będziesz umiał deklarować zmienne i stałe
- będziesz wiedział, czym różnią się deklaracje i przypisania
- będziesz umiał korzystać z biblioteki standardowej do generowania liczb pseudolosowych
Programy komputerowe mogą zrobić naprawdę bardzo dużo. Podczas tej lekcji napiszesz kilka programów rozwiązujących zadania matematyczne.
TEMAT DO PRZEMYŚLENIA Po co pisać program, skoro można po prostu użyć kalkulatora?
Tak? To może pamiętasz, jaka jest prędkość światła? Albo w ciągu jakiego czasu Mars okrąża Słońce? Na kalkulatorze policzysz coś i zapomnisz. W kodzie programu możesz zawrzeć więcej. Możesz zapisać go i użyć ponownie w przyszłości. Kod pełni jednocześnie rolę kalkulatora i notatnika. Program to wykonywalny dokument, który można udostępniać i modyfikować.
2.1 Wykonywanie obliczeń
Są dni, kiedy każdy chciałby być trochę młodszy i, na przykład, mniej ważyć. Planeta Mars mogłaby w tym pomóc. Mars potrzebuje aż 687 ziemskich dni, aby okrążyć Słońce, a słabsza grawitacja na jego powierzchni oznacza, że wszystko waży na nim mniej więcej 38% tego co na Ziemi.
Napiszmy więc mały program, pokazany na listingu 2.1, który obliczy, jak młody i lekki byłby autor tej książki na Marsie. Go udostępnia te same _operatory arytmetyczne_ co inne języki programowania: +, –, *, / i % (czyli dodawanie, odejmowanie, mnożenie, dzielenie i modulo).
WSKAZÓWKA Operator modulo (%) oblicza resztę z dzielenia dwóch liczb całkowitych (np. 42 % 10, to 2).
Listing 2.1 Witaj na Marsie – mars.go
// Mój program odchudzania.
package main
import "fmt"
// main, to funkcja, od której wszystko się zaczyna.
func main() {
fmt.Print("Moja waga na Marsie ważyłbym, to")
fmt.Print(61.0 * 0.3783)
fmt.Print("kg i miałbym")
fmt.Print(41 * 365 / 687)
fmt.Print("lat.")}
Komentarze dla ludzi czytających program
Wyświetli: 23.058
Wyświetli: 21
UWAGA Chociaż listing 2.1 wyświetla wagę w kilogramach, to wybrana jednostka miary nie ma wpływu na obliczenia wagi. Waga na Marsie to zawsze 37,83% wagi na Ziemi, niezależnie od jednostki.
Kod w poprzednim listingu zaczyna się od komentarza. Gdy kompilator Go zobaczy podwójny ukośnik //, zignoruje wszystko na prawo od niego, aż do końca wiersza. W programowaniu komputerowym chodzi o komunikatywność. Kod przekazuje komputerowi instrukcje i jeśli jest dobrze napisany, to innym czytającym go osobom przekazuje także intencje jego twórcy. Komentarze są więc dla nas i nie wpływają na działanie programu.
Poprzedni listing wywołuje funkcję Print kilka razy, aby wyświetlić zdanie w jednym wierszu. Funkcji Print możesz też przekazać listę _argumentów_ rozdzielonych przecinkami. Argumenty funkcji Println mogą być tekstem, liczbą lub _wyrażeniem_ arytmetycznym:
fmt.Println "Na Marsie ważyłbym", 61.0*0.3783, "kg i miałbym tam",
➥41*365.2425/687, "lat.")
Deklaruje pakiet, do którego należy ten kod
SZYBKI TEST 2.1 Wpisz i wykonaj program z listingu 2.1 w Go Playground, na stronie play.golang.org. Ile ty ważyłbyś na Marsie? Ile miałbyś lat? Zastąp wiek autora książki (41) i jego wagę (61.0) swoimi danymi.
WSKAZÓWKA Po zmodyfikowaniu kodu w Go Playground kliknij na przycisk „Format” (Sformatuj). Spowoduje on automatyczne przeformatowanie wcięć i odstępów w kodzie bez zmiany jego działania.
2.2 Wydruk sformatowany
Funkcje Print i Println mają krewną, która daje większą kontrolę nad sposobem wyświetlania tekstu. Jest nią funkcja Printf z poniższego listingu. Używając jej, możesz wstawiać wartości w dowolnym miejscu wyświetlanego tekstu.
Listing 2.2 Printf – fmt.go
fmt.Printf("Na Marsie ważyłbym %v kg,", 61.0*0.3783)
fmt.Printf("i miałbym tam %v lat.\n", 41*365/687)
Wyświetli: Na Marsie ważyłbym 23.058 kg
Wyświetli: i miałbym tam 21 lat
ODPOWIEDŹ NA ST 2.1 Wynik będzie oczywiście zależał od twojej wagi i wieku.
W odróżnieniu od Print i Println, pierwszym argumentem funkcji Printf jest zawsze tekst. Tekst ten zawiera tzw. _kod formatujący_ %v, w miejscu którego zostanie podstawiona _wartość_ wyrażenia przekazanego przez drugi argument.
UWAGA W kolejnych lekcjach wprowadzimy więcej kodów formatujących (innych niż %v). Ich pełny opis można znaleźć w dokumentacji online pod adresem golang.org/pkg/fmt/.
Funkcja Println automatycznie przechodzi do kolejnego wiersza, ale Printf i Print już nie. Zawsze, gdy chcesz przejść do nowego wiersza, musisz w tekście wstawić znak \n.
Jeśli w tekście pojawi się wiele kodów formatujących, funkcja Printf podmieni je na wartości kolejnych jej argumentów
fmt.Printf ("Moja waga na powierzchni %v to %v kg.\n", "Ziemi", 61.0)
Wyświetli: Moja waga na powierzchni Ziemi to 23.058 kg
Oprócz podstawiania wartości w dowolnym miejscu tekstu Printf może też pomóc w wyrównywaniu tekstu. Elementem kodu formatującego może być też szerokość, na przykład %4v. Oznacza to, że wartość musi zostać dopełniona znakami tak, aby miała szerokość 4 znaków. W przypadku liczb dodatnich po lewej stronie pojawią się spacje, a w przypadku liczb ujemnych spacje pojawią się po prawej stronie:
fmt.Printf("%-15v $%4v\n", "SpaceX", 94)
fmt.Printf("%-15v $%4v\n", "Virgin Galactic", 100)
Powyższy kod wyświetli:
SpaceX $ 94
Virgin Galactic $ 100
Szybki test 2.2
1 Jak wydrukować coś w nowym wierszu?
2 Co robi Printf, gdy napotka kod formatujący %v?
Odpowiedź na ST 2.2
1 Aby wstawić znak nowego wiersza, użyj \n w dowolnym miejscu drukowanego tekstu albo użyj funkcji fmt.Println().
2 Kod formatujący %v jest podmieniany na wartości z kolejnych argumentów.
2.3 Stałe i zmienne
Obliczenia z listingu 2.1 wykonywaliśmy na _literałach_ numerycznych. W programie pojawiają się konkretne wartości, ale trudno zorientować się, czym są poszczególne liczby. Skąd mamy wiedzieć, czym jest 0.3783? Takie literały numeryczne niejasnego pochodzenia programiści nazywają czasami _liczbami magicznymi_. W poprawianiu czytelności kodu pomagają stałe i zmienne, które zastępują takie liczby opisowymi nazwami.
Gdy już zrozumiemy korzyści płynące z życia na Marsie, naszym następnym pytaniem będzie zapewne: ile czasu się tam leci? Najlepiej byłoby podróżować z prędkością światła. Światło porusza się w próżni ze _stałą_ prędkością, co ułatwi nam obliczenia. Natomiast odległość między Ziemią a Marsem istotnie się _zmienia_, w zależności od tego, w którym miejscu swoich orbit okołosłonecznych znajdują się te dwie planety.
Poniższy listing wprowadza dwa nowe słowa kluczowe: const i var, które służą do deklarowania odpowiednio: stałych i zmiennych.
Listing 2.3 Podróżowanie z prędkością światła – lightspeed.go
// Ile czasu się leci na Marsa?
package main
import "fmt"
func main() {
const lightSpeed = 299792 // km/s
var distance = 56000000 // km
fmt.Println(distance/lightSpeed, "sekund")
distance = 401000000
fmt.Println(distance/lightSpeed, "sekund")
}
Wyświetli: 186 sekund
Wyświetli: 1337 sekund
Wpisz listing 2.3 w Go Playground i kliknij na „Run”. Ach ta prędkość światła! Gdyby nasze samochody ją rozwijały, dzieci nigdy nie pytałyby: „Daleko jeszcze?”.
Pierwsze obliczenie zakłada, że Mars i Ziemia są do siebie maksymalnie zbliżone. W deklaracji zmiennej distance przypisujemy jej wartość 56 000 000 km. Później zmiennej distance przypiszemy wartość 401 000 000 km, która będzie odpowiadać położeniu planet po przeciwnych stronach Słońca. Tę odległość policzymy tylko po to, żeby zrobić wrażenie na podróżniku, bo przecież lot na skróty przez Słońce może nie być zbyt przyjemny.
UWAGA Wartości stałych, czyli w tym przykładzie lightSpeed, nie można zmieniać. Jeśli spróbujesz przypisać jej nową wartość, kompilator Go zgłosi błąd „cannot assign to lightSpeed” (przypisanie do lightSpeed jest niemożliwe).
UWAGA Aby móc użyć zmiennych, najpierw trzeba je zadeklarować. Język Go zgłosi błąd, jeśli przypiszesz wartość zmiennej, która nie została wcześniej zadeklarowana za pomocą słowa kluczowego var, na przykład gdy napiszesz: speed = 16. To ograniczenie może pomóc w wyłapywaniu literówek, na przykład gdy przypadkiem będziesz chciał przypisać wartość zmiennej distence, podczas gdy tak naprawdę chodzi ci o distance.
Szybki test 2.3
1 Międzyplanetarny system transportu SpaceX nie ma jeszcze napędu nadświetlnego, ale zapewnia podróż na Marsa z prędkością 100 800 km/h. Jego start na Marsa zaplanowano na styczeń 2025 roku, kiedy Mars i Ziemię będzie dzielić 96 300 000 km. Ile dni zajmie dotarcie na Marsa? Zmodyfikuj listing 2.3, aby się tego dowiedzieć.
2 Jeden ziemski dzień trwa 24 godziny. Jakiego słowa kluczowego użyłbyś, aby zamiast wartości 24 użyć jakiejś bardziej opisowej nazwy w swoim programie?
2.4 Na skróty
Na Marsa nie ma drogi na skróty, za to Go udostępnia kilka skrótów oszczędzających liczbę wpisywanych znaków.
2.4.1 Kilka zmiennych można zadeklarować jednocześnie
Kiedy deklarujesz zmienne lub stałe, możesz zadeklarować każdą z nich w osobnym wierszu w następujący sposób:
var distance = 56000000
var speed = 100800
ODPOWIEDŹ NA ST 2.3
1 Co prawda statki kosmiczne nie latają po linii prostej, ale w przybliżeniu podróż
zajęłaby 39 dni.
const hoursPerDay = 24
var speed = 100800 // km/h
var distance = 96300000 // km
fmt.Println(distance/speed/hoursPerDay, "dni")
2 Chodzi o słowo kluczowe const, ponieważ ta wartość nie zmienia się podczas działania programu.
Możesz też zadeklarować je zbiorczo:
var (
distance = 56000000
speed = 100800
)
Kolejną możliwością jest zadeklarowanie wielu zmiennych w jednym wierszu:
var distance, speed = 56000000, 100800
Zanim zadeklarujesz wiele zmiennych zbiorczo lub w jednym wierszu, zastanów się, czy zmienne te są w jakiś sposób ze sobą powiązane. Zawsze pamiętaj o czytelności swojego kodu.
SZYBKI TEST 2.4 Jaki jeden wiersz kodu zadeklarowałby zarówno liczbę godzin w ciągu dnia, jak i liczbę minut w ciągu godziny?
2.4.2 Operatory inkrementacji i przypisania
Istnieje kilka skrótów umożliwiających jednoczesne wykonywanie przypisań i innych operacji. Ostatnie dwa wiersze poniższego listingu są równoważne.
Listing 2.4 Operatory przypisania – shortcut.go
var weight 149.0
weight = weight * 0.3783
weight *= 0.3783
Operacja zwiększania o jeden ma jeszcze jeden skrócony zapis, który pokazano na poniższym listingu.
Listing 2.5 Operator inkrementacji
var age = 41
age = age + 1
age += 1
age++
Sto lat!
Odpowiedź na ST 2.4
const hoursPerDay, minutesPerHour = 24, 60
Dekrementację można wykonać w następujący sposób count--. W ten sam sposób można też skrótowo zapisać inne operacje, na przykład price /= 2.
UWAGA Go nie obsługuje prefiksowych wersji operatorów inkrementacji, czyli ++count, które są dostępne w językach typu C i Java.
SZYBKI TEST 2.5 Jak najkrócej odjąć dwa kg od zmiennej o nazwie waga?
2.5 Pomyśl o jakiejś liczbie
Pomyśl o jakiejś liczbie z zakresu od 1 do 10.
Już? Ok.
No to, co zrobić, aby to komputer wybrał jakąś losową liczbę z zakresu od 1 do 10? Otóż komputer może generować liczby pseudolosowe, korzystając z funkcji z pakietu rand. Liczby te są nazywane _pseudolosowymi,_ ponieważ są losowe tylko z grubsza, a nie całkowicie.
Kod z listingu 2.6 wyświetla dwie liczby o wartościach z zakresu od 1 do 10. Przekazanie wartości 10 do funkcji Intn _zwróci_ liczbę z zakresu od 0 do 9. Dodamy do niej 1 i wynik przypiszemy zmiennej num. Zmienna num nie może być stałą, ponieważ jest wynikiem wywołania funkcji.
UWAGA Jeśli zapomnisz dodać 1, otrzymasz liczbę z zakresu od 0 do 9, a przecież chodziło nam o liczby z zakresu od 1 do 10. Ten błąd jest przykładem typowego błędu w programowaniu nazywanego „pomyłką o jeden” (_off-by-one_).
Listing 2.6 Liczby losowe – rand.go
package main
import (
"fmt"
"math/rand"
)
Odpowiedź na ST 2.5
waga -= 2
func main() {
var num = rand.Intn(10) + 1
fmt.Println(num)
num = rand.Intn(10) + 1
fmt.Println(num)
}
_Ścieżką importu_ dla pakietu rand jest math/rand. Funkcja Intn jest poprzedzona nazwą pakietu rand, ale pełna ścieżka importu jest dłuższa.
WSKAZÓWKA Aby użyć nowego pakietu, trzeba go wymienić w sekcji import. Środowisko Go Playground może wstawiać za ciebie odpowiednie ścieżki importu. Sprawdź tylko, czy pole wyboru „Imports” zostało zaznaczone, a następnie kliknij na przycisk „Format”. Go Playground sprawdzi, które pakiety są używane w programie i zaktualizuje ścieżki importu.
UWAGA Gdy uruchamiasz listing 2.6, za każdym razem wyświetlane są te same dwie liczby pseudolosowe. O co chodzi? Generator liczb pseudolosowych generuje liczby na podstawie wartości zegara, a w Go Playground czas zaczyna płynąć w chwili uruchomienia programu. Dlatego po każdym uruchomieniu programu, gdy losowane są liczby, zegar ma taką samą wartość i losowane liczby są takie same.
SZYBKI TEST 2.6 Odległość między Ziemią a Marsem zależy od tego, czy planety te są po tej samej stronie, czy po przeciwnych stronach Słońca. Napisz program, który generuje losową odległość w zakresie od 56 000 000 do 401 000 000 km.
Podsumowanie
- Funkcje Print, Println i Printf wyświetlają tekst i liczby na ekranie.
- Dzięki Printf i kodowi formatującemu %v wartości można podstawiać w dowolnym miejscu wyświetlanego tekstu.
- Stałe deklaruje się za pomocą słowa kluczowego const i nie można ich zmieniać.
- Zmienne deklaruje się za pomocą słowa kluczowego var i można im przypisywać nowe wartości podczas działania programu.
Odpowiedź na ST 2.6
// losowa odległość do Marsa (km)
var distance= rand.Intn(345000001) + 56000000
fmt.Println(distance)
- Ścieżka importu math/rand dotyczy pakietu rand.
- Funkcja Intn z pakietu rand generuje liczby pseudolosowe.
- Poznałeś już i użyłeś 5 z 25 słów kluczowych języka Go. Są to: package, import, func, const i var.
Zobaczmy, czy łapiesz...
Poeksperymentuj – malacandra.go
Malakandra jest znacznie bliżej – dojdziemy tam za około dwadzieścia osiem dni.
C. S. Lewis, Z milczącej planety
_Malakandra_ to kolejna nazwa Marsa. Pochodzi ona z _Trylogii kosmicznej_ autorstwa C. S. Lewisa. Napisz program określający, jak szybko musiałby podróżować statek kosmiczny (podając prędkość w km/h), aby dotrzeć na Malakandrę w ciągu 28 dni. Przyjmijmy, że odległość do Marsa to 56 000 000 km.
Porównaj swoje rozwiązanie z listingiem w załączniku.