Plan Szkolenia
1. Wprowadzenie do Go
- Czym jest Go (Golang)?
- Historia i filozofia projektowania Go
- Go jako język programowania do tworzenia aplikacji internetowych i systemowych
- Kluczowe cechy:
- Statyczne typowanie
- Prostota i czytelność
- Szybka kompilacja
- Wbudowana współbieżność
- Odbieranie śmieci (garbage collection)
- Platformowe kompilowanie (cross-compilation)
- Powszechne przypadki zastosowania Go
- Zalety i ograniczenia Go
- Porównanie Go z C/C++, JavaScript, Ruby, Python i Java
- Zrozumienie ekosystemu Go
- Przegląd standardowej biblioteki Go
- Moduły Go i zarządzanie zależnościami
- Struktura aplikacji Go
- Praca praktyczna: Analiza i uruchomienie prostego programu w Go
2. Konfiguracja środowiska programistycznego Go
- Instalacja Go
- Znajomość zestawu narzędzi Go (toolchain)
- Konfigurowanie zmiennych środowiskowych
- Wybór IDE lub edytora kodu
- Praca w linii poleceń z Go
- Tworzenie przestrzeni roboczej Go (workspace)
- Zrozumienie struktury projektu Go
- Inicjalizacja projektu za pomocą Go Modules
- Używanie
go mod init - Zarządzanie zależnościami za pomocą
go get - Aktualizowanie i inspektowanie zależności
- Formatowanie kodu źródłowego za pomocą
gofmt - Uruchamianie programów za pomocą
go run - Budowanie aplikacji za pomocą
go build - Instalacja aplikacji Go
- Kompilacja międzyplatformowa
- Praca praktyczna: Utworzenie i skonfigurowanie projektu Go wewnątrz kontenera
3. Zmienne, stałe i typy w Go
- Deklarowanie zmiennych
- Typy jawne w porównaniu z wywnioskowanymi
- Skrócone deklaracje zmiennych
- Stałe
- Wartości zerowe
- Zakres i czas życia zmiennych
- Elementarne typy danych:
- Liczby całkowite
- Liczby zmiennoprzecinkowe
- Liczby zespolone
- Wartości logiczne
- Łańcuchy znaków
- Konwersje typów
- Praca z Unicode i UTF-8
- Runesy i bajty
- Wielokrotne przypisywanie wartości zmiennym
- Zrozumienie bezpieczeństwa typów
- Ćwiczenie: Stworzenie małego programu przetwarzającego dane w linii poleceń
4. Operatory i wyrażenia
- Operatory arytmetyczne
- Operatory porównania
- Operatory logiczne
- Operatory przypisania
- Inkrementacja i dekrementacja
- Priorytet operatorów
- Obliczenia na liczbach całkowitych i zmiennoprzecinkowych
- Unikanie powszechnych błędów konwersji typów
- Ćwiczenie: Zaimplementowanie logiki obliczeń i walidacji
5. Daty, czasy i formatowanie
- Wykorzystywanie pakietu
time - Tworzenie i manipulowanie datami
- Pobieranie aktualnego czasu
- Strefy czasowe i lokalizacje
- Analiza (parsing) dat i czasu
- Formatowanie dat i czasu
- Obliczanie różnic czasowych (durations)
- Praca ze znacznikami czasu Unix
- Obsługa limitów czasu (timeoutów)
- Ćwiczenie: Dodanie znaczników czasu i obliczeń różnic czasowych do aplikacji
6. Tablice, tablice dynamiczne (slices), mapy i struktury
Tablice
- Deklarowanie tablic
- Inicjalizacja tablic
- Iterowanie po tablicach
- Tablice wielowymiarowe
Tablice dynamiczne (Slices)
- Różnice między tablicami a slices
- Tworzenie slices
- Dodawanie elementów
- Kopiowanie slices
- Długość i pojemność slices
- Wycinki slices (slicing)
- Powszechne pułapki związane z slices
Mapy
- Tworzenie map
- Dodawanie i usuwanie wpisów
- Sprawdzanie istnienia klucza
- Iterowanie po mapach
- Mapy zawierające złożone dane
Struktury
-
Definiowanie struktur
-
Pola struktur
-
Inicjalizacja struktur
-
Zagnieżdżone struktury
-
Struktury anonimowe
-
Metody struktur
-
Tagi JSON dla struktur
-
Praca praktyczna: Modelowanie użytkowników, produktów i danych aplikacji przy użyciu struktur, slices i map
7. Logika warunkowa i pętle
- Instrukcje
if elseorazelse if- Deklarowanie zmiennych w warunkach
- Pętle
for - Pętle nieskończone
- Warunki pętli
breakorazcontinue- Iterowanie przy użyciu
range - Zagnieżdżone pętle
- Instrukcje
switch - Przełączniki oparte na wyrażeniach
- Wielokrotne przypadki
- Domyślny przypadek
- Przełączniki typów (type switches)
- Ćwiczenie: Zaimplementowanie logiki walidacji i przetwarzania aplikacji
8. Funkcje
- Definiowanie funkcji
- Parametry funkcji
- Wartości zwracane
- Wielokrotne wartości zwracane
- Nazwane wartości zwracane
- Funkcje zmiennoliczbowe (variadic)
- Funkcje anonimowe
- Wartości funkcji
- Zamknięcia (closures)
- Rekursja
- Podawanie funkcji jako argumentów
- Funkcje zwracające błędy
- Projektowanie małych, ponownie używalnych funkcji
- Ćwiczenie: Refaktoryzacja istniejącego kodu na ponownie używalne funkcje
9. Wskaźniki i koncepcje pamięci
- Czym jest wskaźnik?
- Operatory pobierania adresu i odwołania (dereference)
- Wskaźniki i parametry funkcji
- Wskazujące odbiorcy (pointer receivers)
- Wskaźniki do struktur
- Wskaźniki zerowe (nil pointers)
- Kiedy używać wskaźników
- Semantyka wartości w porównaniu z referencją
- Zrozumienie zarządzania pamięcią w Go i odbierania śmieci
- Powszechne błędy związane z wskaźnikami
- Praca praktyczna: Modyfikowanie danych aplikacji za pomocą wskaźników
10. Tworzenie aplikacji internetowej w Go
- Przegląd możliwości webowych Go
- Wprowadzenie do pakietu
net/http - Tworzenie serwera HTTP
- Zapytania i odpowiedzi HTTP
- Metody HTTP
- Adresy URL i parametry zapytań
- Nagłówki HTTP
- Kody statusu HTTP
- Podstawy routingu
- Tworzenie obsłużników (handlers)
- Przetwarzanie danych formularza
- Serwowanie plików statycznych
- Praca z szablonami HTML
- Zmienne szablonowe i struktury sterujące
- Strukturyzowanie aplikacji internetowej
- Praca praktyczna: Zbudowanie podstawowego serwera internetowego w Go
11. Budowanie usług sieciowych RESTful
- Podstawy architektury REST
- Projektowanie punktów końcowych API
- GET, POST, PUT, PATCH i DELETE
- Praca z JSON
- Kodowanie i dekodowanie JSON
- Walidacja zapytań
- Kody statusu HTTP
- Odpowiedzi z błędami
- Parametry zapytań i parametry ścieżki
- Struktury odpowiedzi API
- Odróżnianie obsłużników od logiki biznesowej
- Praca praktyczna: Zbudowanie CRUD REST API
12. Interfejs programowania (Runtime), kompilacja i budowanie projektów Go
- Zrozumienie kompilatora Go
- Proces budowania w Go
go rungo buildgo installgo test- Flagi budowania
- Konfiguracja specyficzna dla środowiska
- Budowanie dla różnych systemów operacyjnych i architektur
- Tworzenie samodzielnych binariów
- Zarządzanie konfiguracją aplikacji
- Ćwiczenie: Skompilowanie aplikacji dla wielu platform
13. Praca z plikami i webem
- Otwieranie i zamykanie plików
- Czytanie plików
- Zapisywanie plików
- Tworzenie katalogów
- Metadane plików
- Buforowane I/O
- Praca z potokami (streams)
- Czytanie i zapisywanie plików JSON
- Klienty HTTP
- Wysyłanie zapytań HTTP
- Obsługa błędów klienta HTTP
- Limity czasu i anulowanie
- Przetwarzanie odpowiedzi API
- Praca praktyczna: Pobieranie danych z zewnętrznego API i ich lokalne utrwalanie
14. Obsługa błędów i debugowanie
- Podejście Go do błędów
- Zwracanie błędów z funkcji
- Sprawdzanie błędów
- Tworzenie niestandardowych błędów
- OWIJANIE błędów (wrapping errors)
- Dodawanie kontekstu do błędów
errors.Isorazerrors.As- panic i recovery
- Kiedy używać
panic - Debugowanie powszechnych problemów w Go
- Rejestrowanie aktywności aplikacji
- Wykorzystywanie narzędzi do debugowania Go
- Ćwiczenie: Diagnozowanie i naprawa celowo wprowadzonych błędów aplikacji
15. Interfejsy i abstrakcja
- Czym jest interfejs?
- Implikowane implementacje interfejsów
- Definiowanie interfejsów
- Wartości interfejsów
- Puste interfejsy /
any - Asercje typów
- Przełączniki typów
- Implementacje przez wskaźnik w porównaniu z wartością
- Projektowanie małych interfejsów
- Inwersja zależności
- Używanie interfejsów do testowania
- Zmniejszanie sprzężenia aplikacji
- Praca praktyczna: Wprowadzenie interfejsów w przykładowej aplikacji internetowej
16. Pakiety i organizacja projektu
- Tworzenie pakietów
- Zasady nazywania pakietów
- Identyfikatory eksportowane i nieeksportowane
- Importowanie pakietów
- Inicjalizacja pakietów
- Organizacja warstw aplikacji
- Pakiety wewnętrzne
- Zarządzanie zależnościami za pomocą Go Modules
- Semantyczne wersjonowanie
- Używanie pakietów zewnętrznych
- Unikanie zależności cyklicznych
- Projektowanie utrzymywalnych projektów Go
- Ćwiczenie: Refaktoryzacja aplikacji na osobne pakiety
17. Współbieżność z Goroutines
- Czym jest współbieżność?
- Goroutines
- Rozpoczynanie goroutines
- Zrozumienie lekkiej współbieżnej egzekucji
- Wyzwania synchronizacji
- Współdzielone stany
- Synergie (race conditions)
- Używanie
sync.WaitGroup - Mutueksy i mutueksy odczytu/zapisu
- Operacje atomowe
- Praca praktyczna: Konwersja zadania sekwencyjnego na równoległe przetwarzanie
18. Kanały (Channels)
- Zrozumienie kanałów
- Wysyłanie i odbieranie wartości
- Kanały buforowane i niebuforowane
- Zachowanie blokujące
- Zamykanie kanałów
- Iterowanie po kanałach
- Kanały kierunkowe
- Komunikacja oparta na kanałach
- Instrukcje select
- Limity czasu i anulowanie
- Wzorce puli pracowników (worker-pool)
- Wzorce producent/konsument
- Praca praktyczna: Zbudowanie równoległego systemu pracowników
19. Kontekst i zarządzanie zapytaniami
- Dlaczego konteksty są ważne w aplikacjach internetowych
context.Context- Kontekst zakresu zapytania
- Anulowanie
- Terminy (deadlines)
- Limity czasu
- Przepuszczanie kontekstu przez warstwy aplikacji
- Anulowanie operacji bazy danych lub HTTP
- Unikanie błędnego użycia kontekstu
- Ćwiczenie: Dodanie anulowania zapytań i limitów czasu do aplikacji internetowej
20. Testowanie aplikacji Go
- Dlaczego automatyzacja testów jest ważna
- Pisanie testów jednostkowych
- Pakiet
testing - Funkcje testowe
- Zasady nazywania testów
- Testy oparte na tabelach
- Testowanie błędów
- Testowanie obsłużników HTTP
- Serwery testowe HTTP
- Fiksy testowe (test fixtures)
- Zakrycie testami
- Testy wydajnościowe (Benchmarks)
- Testy przykładowe
- Testowanie interfejsów za pomocą mocków lub fałszywych implementacji
- Praca praktyczna: Utworzenie pakietu testów dla przykładowej aplikacji
21. Optymalizacja wydajności
- Zrozumienie wydajności aplikacji Go
- Identyfikacja wąskich gardeł
- Wydajność CPU w porównaniu z pamięcią
- Skuteczne struktury danych
- Zmniejszenie niepotrzebnych alokacji
- Łańcuchy znaków, bajty i bufora
- Zarządzanie goroutines
- Unikanie nadmiernej współbieżności
- Strategie cache
- Względy dotyczące bazy danych i sieci
- Profilowanie aplikacji
- Testy wydajnościowe i benchmarki
- Wykorzystywanie narzędzi do profilowania Go
- Ćwiczenie: Profilowanie i optymalizacja celowo nieefektywnej aplikacji
22. Bezpieczeństwo i solidne praktyki tworzenia aplikacji internetowych
- Walidacja danych wejściowych użytkownika
- Bezpieczna obsługa zapytań HTTP
- Przypadki powszechnych luk bezpieczeństwa w webie
- Bezpieczna obsługa błędów
- Koncepcje uwierzytelniania i autoryzacji
- Zarządzanie sekretami i konfiguracją
- Bezpieczna komunikacja HTTP
- Unikanie wrażliwych informacji w logach
- Zarządzanie zależnościami i aktualizacje
- Limity zasobów i limity czasu zapytań
- Ćwiczenie: Przegląd i wzmocnienie przykładowego API
23. Logowanie aplikacji i obserwowalność
- Podstawy logowania
- Logowanie strukturalne
- Poziomy logów
- Logowanie zapytań
- Logowanie błędów
- Skorelowanie i identyfikatory zapytań
- Monitorowanie zachowania aplikacji
- Podstawowe metryki
- Punkty końcowe sprawdzania stanu zdrowia (health-check)
- Diagnozowanie problemów produkcyjnych
- Praca praktyczna: Dodanie strukturalnego logowania i sprawdzania stanu zdrowia
24. Konteneryzacja aplikacji Go
- Dlaczego używać kontenerów?
- Aplikacje Go i konteneryzacja
- Pisanie pliku Dockerfile
- Budowanie wieloetapowe
- Tworzenie minimalistycznego obrazu środowiska wykonawczego
- Zarządzanie konfiguracją za pomocą zmiennych środowiskowych
- Sieciowanie kontenerów
- Eksponowanie portów aplikacji
- Uruchamianie aplikacji w kontenerze
- Testowanie aplikacji konteneryzowanej
- Praca praktyczna: Spakowanie przykładowej aplikacji Go jako kontenera gotowego do produkcji
25. Wdrożenie (Deployment)
- Przygotowanie aplikacji do środowiska produkcyjnego
- Budowanie binariów produkcyjnych
- Konfiguracja środowiska
- Wdrożenie oparte na kontenerach
- Architektura wdrożenia
- Proxy odwrotne
- Rozważania dotyczące HTTPS/TLS
- Sprawdzanie stanu zdrowia aplikacji
- Łagodne wygaszanie (Graceful shutdown)
- Obsługa sygnałów systemu operacyjnego
- Skalowanie aplikacji internetowych Go
- Skalowanie poziome w porównaniu z pionowym
- Podstawowe rozwiązywanie problemów przy wdrożeniach
- Praca praktyczna: Wdrożenie przykładowej aplikacji internetowej
26. Projekt końcowy: Kompletna aplikacja internetowa Go
Uczestnicy łączą ze sobą poznane koncepcje, tworząc kompletną aplikację.
Projekt może obejmować:
- Inicjalizację projektu za pomocą Go Modules
- Organizację pakietów
- Routing HTTP
- Punkty końcowe API REST
- Obsługę zapytań i odpowiedzi JSON
- Walidację danych wejściowych
- Obsługę błędów
- Interfejsy
- Równoległe przetwarzanie
- Komunikację z zewnętrznymi API
- Utrwalanie danych w plikach lub bazie danych
- Automatyczne testy
- Logowanie
- Względy wydajnościowe
- Konteneryzacja
- Konfiguracja produkcyjna
- Wdrożenie
27. Przegląd i najlepsze praktyki
- Przegląd składni podstawowej Go
- Zasady kodowania w Go
- Pisanie idiomy Go
- Trzymanie kodu prostym
- Skuteczne projektowanie pakietów
- Najlepsze praktyki obsługi błędów
- Zasady projektowania interfejsów
- Najlepsze praktyki współbieżności
- Strategie testowania
- Względy wydajnościowe
- Utrzymywalność i czytelność
- Powszechne błędy popełniane przez początkujących programistów Go
- Zalecane podejścia do dalszego rozwoju w Go
28. Podsumowanie
- Przegląd kluczowych koncepcji
- Przegląd ukończonej aplikacji internetowej
- Pytania i dyskusja
- Rozwiązywanie powszechnych problemów realnych
- Zalecane kolejne kroki w rozwoju Go
- Dodatkowe biblioteki Go i zasoby ekosystemu
- Dalsze możliwości budowy usług Go gotowych do produkcji
Wymagania
- Znajomość ogólnych zasad programowania
Grupa docelowa
- Programiści
Opinie uczestników (5)
Trener udowodnił sobie, że jest ekspertem w tej dziedzinie, czego nigdy nie biorę za pewnik. Podzielił się bardzo przydatnymi wglądami w standardy branżowe.
Giuseppe
Szkolenie - Learning Go Programming
Przetłumaczone przez sztuczną inteligencję
Ceniłem ilość ćwiczeń praktycznych, które wykonaliśmy. Osobiście uczę się najlepiej przez robienie rzeczy, więc było dobrze, że Francesco przygotował wiele ćwiczeń praktycznych. Miałem trudności z pojęciem kilku tematów z prezentacji, ale gdy faktycznie zabrałem się do pracy i mogłem zaimplementować kluczowe funkcje języka, lepiej rozumiałem te koncepcje.
Adam Fitzhugh - OpticoreIT
Szkolenie - Learning Go Programming
Przetłumaczone przez sztuczną inteligencję
tempo, zdolność instruktorów do pomocy i utrzymania nieco trudniejszych pytań.
Andrei Mihai - Viasat
Szkolenie - Learning Go Programming
Przetłumaczone przez sztuczną inteligencję
Głęboka wiedza Radu oraz dostosowanie tempo dla mnie.
Adeel Ahmad - Coefficient Data Ltd
Szkolenie - Learning Go Programming
Przetłumaczone przez sztuczną inteligencję
Elastyczność trenera. Naprawdę dostosował kurs do naszych konkretnych potrzeb.
Daniel Kurner - Daimler TSS
Szkolenie - Learning Go Programming
Przetłumaczone przez sztuczną inteligencję