Dane oryginału

Original edition copyright © 2018 by Manning Publications Co. All Rights reserved.
Title of English-language original: Get Programming with Go by Nathan Youngman, Roger Peppe, ISBN 9781617293092. Polish-language edition © 2021 by Polish Scientific Publishers
PWN Wydawnictwo Naukowe PWN Spółka Akcyjna. All Rights reserved.

Przekład Krzysztof Konatowicz

Projekt okładki INT-MEDIA Dawid Mazur

Wydawca Wioleta Szczygielska-Dybciak

Redaktor prowadzący Jolanta Kowalczuk, Monika Zabrocka-Kutera

Redaktor Irena Puchalska

Koordynator produkcji Anna Bączkowska

Skład wersji elektronicznej na zlecenie Wydawnictwa Naukowego PWN

Aneta Pudzisz/Woblink

Konsultacja merytoryczna

Bartłomiej Klimczak

Zastrzeżonych nazw firm i produktów użyto w książce wyłącznie w celu identyfikacji.

Copyright © for the Polish edition by Wydawnictwo Naukowe PWN SA

Warszawa 2021

ISBN 978-83-01-21791-4

eBook został przygotowany na podstawie wydania papierowego z 2021 r., (Wydanie I)

Wydawnictwo Naukowe PWN SA

02-460 Warszawa, ul. Gottlieba Daimlera 2

tel. 22 69 54 321, faks 22 69 54 288

infolinia 801 33 33 88

e-mail: pwn@pwn.com.pl; reklama@pwn.pl

www.pwn.pl

Przedmowa

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.

O autorach

NATHAN YOUNGMAN jest programistą samoukiem aplikacji webowych i uczy się przez całe życie. Jest organizatorem klubu miłośników języka Go w Edmonton, mentorem w Canada Learning Code i fotografem paparazzo bardzo ważnych pluszowych susłów.

ROGER PEPPÉ uczestniczy w rozwoju Go, prowadzi wiele projektów otwartoźródłowych związanych z Go oraz klub miłośników Go w miejscowości Newcastle upon Tyne, a obecnie pracuje nad oprogramowaniem infrastruktury chmurowej dla Go.

0

Pierwsze kroki

Tradycyjnie pierwszym krokiem w nauce nowego języka programowania jest skonfigurowanie narzędzi i środowiska oraz uruchomienie prostej aplikacji wyświetlającej tekst „Hello, world”. Dzięki Go Playground to zadanie ogranicza się do jednego kliknięcia!

Mamy więc to już z głowy i możemy od razu przejść do nauki składni i pojęć potrzebnych do pisania i modyfikowania prostych programów.

LEKCJA 1

NA MIEJSCA, GOTÓW, START

Po przeczytaniu lekcji 1:

będziesz wiedział, co odróżnia Go od innych języków

odwiedzisz „plac zabaw” Go Playground

wyświetlisz tekst na ekranie

poeksperymentujesz z tekstem w języku naturalnym

Go to nowoczesny język programowania chmur obliczeniowych. Firmy takie jak Amazon, Apple, Canonical, Chevron, Disney, Facebook, General Electric, Google, Heroku, Microsoft, Twitch, Verizon i Walmart należą do grona zwolenników języka, zdecydowały się na jego użycie w wielu poważnych projektach (patrz thenewstack.io/who-is-the-go-developer/ i golang.org/wiki/GoUsers). Obecnie znaczna część infrastruktury sieciowej przechodzi na Go. Zrobiły to już takie firmy jak CloudFlare, Cockroach Labs, DigitalOcean, Docker, InfluxData, Iron.io, Let’s Encrypt, Light Code Labs, Red Hat CoreOS, SendGrid oraz takie organizacje jak Cloud Native Computing Foundation.

Język Go doskonale sprawdza się w centrach danych, ale jego zastosowania nie ograniczają się wyłącznie do zastosowań w korporacjach. Ron Evans i Adrian Zankich opracowali bibliotekę Gobot (gobot.io) przeznaczoną do sterowania robotami i urządzeniami. Alan Shreve, jako ćwiczenie podczas nauki języka Go, stworzył narzędzie programistyczne ngrok (ngrok.com), które z czasem przekształciło się w pełnoprawne komercyjne narzędzie.

Społeczność zwolenników języka Go określa siebie słowem gophers (susły). Określenie to pochodzi od maskotki języka Go – zabawnego susła (rys. 1.1). Programowanie bywa trudne, ale mamy nadzieję, że dzięki Go i tej książce odkryjesz, na czym polega radość z programowania.

Rysunek 1.1 Suseł – maskotka Go zaprojektowana przez Renée French

Podczas tej lekcji poeksperymentujesz z programem w języku Go w przeglądarce internetowej.

Temat do przemyślenia Gdy mówisz do cyfrowego asystenta „Kup mi piłkę”, czy kupi ci on piłkę do koszykówki, czy pomyśli, że chcesz przeciąć rurę i potrzebujesz piłki do metalu? Języki naturalne, takie jak polski, są pełne takich niejednoznaczności.

W językach programowania jednoznaczność jest bardzo ważna, bo jeśli gramatyka lub składnia języka nie będą wystarczająco ścisłe, to komputer może nie zrobić tego, czego od niego oczekujesz. A wtedy programowanie nie będzie miało sensu.

Go nie jest językiem idealnym, ale zapewnia większą jednoznaczność niż inne języki, których używaliśmy do tej pory. W trakcie tej lekcji będziesz musiał nauczyć się kilku skrótów i przyswoić trochę żargonu. Może nie wszystko będzie od razu jasne, ale poświęć trochę czasu, aby poznać, jak działa Go i rozwiać swoje wątpliwości.

1.1 Czym jest Go?

Go to kompilowany język programowania. Aby program napisany w tym języku mógł zostać uruchomiony, jego kod źródłowy musi być najpierw przetworzony przez kompilator, który przetłumaczy go na jedynki i zera zrozumiałe dla komputerów. W wyniku kompilacji kodu powstaje jeden plik wykonywalny, który można potem uruchamiać albo dystrybuować. Kompilator Go analizuje treść kodu źródłowego programu i wyłapuje literówki i błędy.

Nie wszystkie języki programowania stosują takie podejście. Języki takie jak Python, Ruby i jeszcze kilka innych używają interpretera, który tłumaczy kolejno instrukcje w trakcie wykonywania programu. Oznacza to, że błędy mogą pozostać niewykryte w różnych częściach kodu i nie ujawnić się, zanim nie zostaną one wykonane.

Jednocześnie interpretery przyspieszają pisanie kodu i zapewniają interaktywność, dzięki czemu interpretowane języki programowania są dynamiczne, łatwe i przyjemne. Języki kompilowane mają reputację statycznych, nieelastycznych machin, które programiści muszą z trudem okiełznać, a powolność kompilatorów jest przedmiotem wielu żartów. Ale czy tak musi być zawsze?

Chcieliśmy stworzyć język zapewniający bezpieczeństwo i wydajność znaną z języków kompilowanych statycznie, takich jak C++ i Java i jednocześnie lekkość i przyjemność pracy znaną z interpretowanych języków z typowaniem dynamicznym, takich jak Python.

Rob Pike, Geek of the Week
(zobacz mng.bz/jr8y)

Język Go został stworzony z założeniem zapewnienia programistom jak najlepszych doświadczeń podczas pisania kodu. Go kompiluje bardzo duże programy w ciągu paru sekund, po wydaniu jednego polecenia. Zrezygnowano w nim z elementów, które wprowadzają niejednoznaczności, i skupiono się na tych, które zachęcają do programowania w sposób przewidywalny i które zapewniają czytelność. Go jest więc lekką alternatywą dla sztywnej struktury narzucanej przez języki klasyczne, takie jak Java.

W Javie zrezygnowano z wielu rzadko używanych, słabo rozumianych i mylących funkcji języka C++, które według naszych doświadczeń przynoszą więcej problemów niż korzyści.

James Gosling, w artykule Java: an Overview

Każdy nowy język programowania rozwija i udoskonala stare idee. W Go wydajne używanie pamięci jest łatwiejsze i mniej podatne na błędy niż w starszych językach. Poza tym Go umie wykorzystać każdy rdzeń procesorów wielordzeniowych. Z doświadczeń wynika, że przejście na Go jest często motywowane chęcią poprawy sprawności i wydajności tworzenia oprogramowania. Spółka Iron.io zastąpiła 30 swoich serwerów Ruby 2 serwerami z programami napisanymi w Go (patrz mng.bz/Wevx i mng.bz/8yo2). Serwis Bitly „dostrzegł stały, wymierny przyrost wydajności” po przepisaniu aplikacji stworzonych w Pythonie na kod w Go. Później wymienił swoje aplikacje napisane w C na odpowiedniki napisane w Go (zobacz mng.bz/EnY l).

Go zapewnia radość i łatwość znaną z języków interpretowanych, jednocześnie zwiększając wydajność i niezawodność. Go jest małym językiem, w którym do opanowania jest tylko kilka prostych pojęć, dlatego stosunkowo szybko można się go nauczyć. Mottem Go są trzy cechy jego języka:

Go jest językiem programowania typu open source, umożliwiającym tworzenie prostego, wydajnego i niezawodnego oprogramowania o dużej skali.

Go Brand Book

WSKAZÓWKA Aby znaleźć w internecie tematy związane z językiem Go, używaj w wyszukiwaniach słowa „golang”, które oznacza „język Go”. Przyrostka -lang możesz również używać, poszukując informacji na temat innych języków programowania, na przykład: Ruby, Rust itd.

Szybki test 1.1 Jakie są dwie najważniejsze zalety kompilatora Go?

1.2 „Plac zabaw” – Go Playground

Najszybszym sposobem rozpoczęcia nauki Go jest wejście na stronę play.golang.org. Znajduje się tam „plac zabaw” do nauki Go – Go Playground (rys. 1.2). Możesz tam pisać, uruchamiać i sprawdzać programy w Go bez konieczności instalowania czegokolwiek. Po kliknięciu przycisku „Run” (Uruchom) napisany program zostanie skompilowany, jego kod wykona się na serwerach Google i wyświetli wynik w oknie poniżej.

Odpowiedź na ST 1.1 Duże programy kompilują się w kilka sekund, a kompilator Go wychwytuje literówki i błędy przed uruchomieniem programu.

Rysunek 1.2 „Plac zabaw” – Go Playground

Jeśli klikniesz na przycisk „Share” (Udostępnij), pojawi się link umożliwiający odtworzenie w przyszłości napisanego przez ciebie programu. Link ten możesz też udostępnić znajomym lub dodać go sobie do zakładek, aby zapisać swoją pracę.

UWAGA Go Playground możesz użyć do wpisania każdego listingu i ćwiczenia z tej książki. Albo, jeśli wiesz, jak posługiwać się edytorem tekstu i wierszem poleceń, możesz pobrać kompilator Go ze strony golang.org/dl/ i zainstalować na swoim komputerze.

Szybki test 1.2 Co robi przycisk Run w The Go Playground?

1.3 Pakiety i funkcje

Gdy przejdziesz na stronę Go Playground, zobaczysz następujący kod, od którego możesz zacząć naukę.

Listing 1.1 Hello, playground – playground.go

package main

import (

"fmt"

)

func main() {

fmt.Println("Siemka!")

}

Deklaruje pakiet, do którego należy ten kod

Udostępnia pakiet fmt (format) do użycia w kodzie

Deklaruje funkcję o nazwie main

Wyświetli na ekranie: Siemka!

Odpowiedź na ST 1.2 Przycisk Run skompiluje, a następnie wykona kod na serwerach Google.

Choć ten program jest krótki, to pojawiają się w nim aż trzy słowa kluczowe: package, import oraz func. Każde słowo kluczowe jest zastrzeżone (co oznacza, że nie należy nadawać tych nazw zmiennym, stałym ani funkcjom) i ma określone znaczenie.

Słowo kluczowe package deklaruje pakiet, do którego należy kod w pliku. W tym przypadku jest to pakiet o nazwie main. Kod źródłowy programu w języku Go jest podzielony na pakiety. Go udostępnia standardową bibliotekę zawierającą różne pakiety umożliwiające wykonywanie obliczeń matematycznych, kompresję danych, wykonywanie operacji kryptograficznych, manipulowanie obrazami i wiele innych. Każdy pakiet odpowiada innej dziedzinie.

W kolejnym wierszu słowo kluczowe import określa, jakie pakiety będą używane w tym pliku. Pakiety mogą zawierać dowolną liczbę funkcji. Na przykład pakiet math zawiera funkcje takie jak Sin, Cos, Tan i Sqrt (trygonometryczne i pierwiastek kwadratowy). Pakiet fmt udostępnia funkcje sformatowanego wejścia i wyjścia. Wyświetlanie tekstu na ekranie jest często stosowaną operacją, dlatego nazwa tego pakietu została skrócona do trzech liter „fmt”.

Słowo kluczowe func deklaruje funkcję. W tym przypadku jest to funkcja o nazwie main. Ciało każdej funkcji jest otoczone nawiasami klamrowymi {}, dzięki którym Go wie, gdzie każda funkcja się zaczyna i kończy.

Identyfikator main ma szczególne znaczenie. Kiedy uruchamiasz program napisany w języku Go, jego wykonywanie zaczyna się właśnie od funkcji main w pakiecie main. Gdy takiej funkcji zabraknie, kompilator Go zgłosi błąd, ponieważ nie będzie wiedział, od którego miejsca zacząć wykonywanie programu.

Aby wydrukować wiersz tekstu, można użyć funkcji Println (czasownik print znaczy drukuj, a ln to skrót od line, czyli wiersz). Przed Println pojawia się nazwa fmt i kropka, ponieważ ta funkcja pochodzi z pakietu fmt. Gdy chcesz użyć jakiejś funkcji z zaimportowanego pakietu, musisz jej nazwę poprzedzić nazwą pakietu i kropką. Dzięki temu czytając kod w Go, łatwo się zorientujesz, z którego pakietu pochodzi dana funkcja.

Uruchom ten program w Go Playground. Poniżej powinien pojawić się tekst Siemka!. Tekst ujęty w cudzysłów zostanie wyświetlony bez zmian na ekranie. Jak wiadomo jeden przecinek w ustawie sejmowej potrafi zupełnie zmienić jej sens. W językach programowania interpunkcja też jest bardzo ważna. Język Go wykorzystuje cudzysłowy, nawiasy okrągłe i klamrowe do oznaczania różnych elementów w kodzie.

Szybki test 1.3

1 Gdzie zaczyna się wykonywanie programu w Go?

2 Co zapewnia pakiet fmt?

1.4 Jedyny słuszny styl wcięć

Język Go jest bardzo wybredny, jeśli chodzi o to, gdzie mogą się pojawiać nawiasy klamrowe {}. Na listingu 1.1 nawias otwierający { znajduje się w tym samym wierszu co słowo kluczowe func, a nawias zamykający } pojawia się w wierszu samodzielnie. To właśnie jedyny słuszny styl wcięć języka Go. Nawet nie próbuj niczego innego – nie da rady, nie zadziała! Zobacz mng.bz/NdE2.

Aby zrozumieć, dlaczego Go jest tak surowe, jeśli chodzi o zapis, musimy cofnąć się do narodzin Go. W tamtych czasach kod źródłowy programów był bardzo zaśmiecony średnikami. Wszędzie było ich pełno i nie było jak przed nimi uciec! Średniki pojawiały się za każdą instrukcją, jak obłąkane. Na przykład:

fmt.Println("Witaj świecie");

Odpowiedź na ST 1.3

1 Wykonywanie programu zaczyna się od funkcji main w pakiecie main.

2 Pakiet fmt udostępnia funkcje sformatowanego wejścia i wyjścia.

W grudniu 2009 roku grupa zakręconych susłów pozbyła się z Go średników. No może nie do końca. Tak naprawdę kompilator Go sam wstawia sobie te średniki – rozwiązanie to jednak doskonale się sprawdza. Jest łatwiej, ale zamiast średników, trzeba stosować jedyny słuszny styl wcięć.

Jeśli nawias otwierający umieścisz w kolejnym wierszu, po słowie kluczowym func, kompilator Go zgłosi błąd składni:

func main()

{

}

Brak ciała funkcji

Błąd składni – nieoczekiwany średnik lub znak nowej linii przed {

Ale nie myśl, że kompilator robi ci na złość! Chciał dobrze, ale wstawił średnik w niewłaściwym miejscu i trochę się pogubił.

WSKAZÓWKA Podczas przeglądania tej książki warto samodzielnie przepisywać umieszczone w niej przykłady. Czasem, gdy coś pomylisz, pojawi się komunikat o błędzie składniowym, ale o to właśnie chodzi. Czytanie, rozumienie i samodzielne poprawianie błędów to ważne umiejętności, a wytrwałość to cenna cecha.

Szybki test 1.4 Gdzie należy umieszczać nawiasy otwierające {, aby uniknąć błędów składniowych?

Podsumowanie

Dzięki Go Playground możesz zacząć programować w Go bez konieczności instalowania czegokolwiek.

Każdy program w języku Go składa się z funkcji znajdujących się w pakietach.

Aby wydrukować tekst na ekranie, należy użyć pakietu fmt z biblioteki standardowej.

Interpunkcja jest tak samo ważna w językach programowania jak w językach naturalnych.

Poznałeś 3 z 25 słów kluczowych języka Go: package, import i func.

Nawias otwierający musi znajdować się w tym samym wierszu co słowo kluczowe func, a nie w wierszu poniżej. To właśnie jedyny słuszny styl wcięć.

Zobaczmy, czy już łapiesz...

W poniższym ćwiczeniu zmień coś w kodzie w Go Playground i kliknij na przycisk Run, aby zobaczyć wynik jego działania. Jeśli coś się nie uda, odśwież stronę, aby odzyskać poprzedni kod.

Poeksperymentuj – playground.go

Zmień tekst wyświetlany na ekranie, zmieniając litery między cudzysłowami. Spraw, żeby komputer przywitał cię, podając twoje imię.

Wyświetl dwa wiersze tekstu, dopisując drugi wiersz w ciele funkcji main (między nawiasami {} ). Na przykład:
fmt.Println("Siemka!")
fmt.Println("Piąteczka Władek!")

Go obsługuje znaki narodowe każdego języka. Spróbuj wyświetlić jakiś tekst w języku chińskim, japońskim, rosyjskim lub hiszpańskim. Jeśli nie znasz tych języków, możesz skorzystać z serwisu Google Translate (translate.google.com) i skopiować/wkleić tekst do Go Playground.

Użyj przycisku Share, aby wygenerować link do swojego programu i udostępnić go innym czytelnikom, na przykład publikując go na forach książki Get Programming with Go (forums.manning.com/forums/get-programming-with-go).

Porównaj swoje rozwiązanie z listingiem z Dodatku.

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.