Dokumentacja Go
Zwięzła dokumentacja Go oparta na przykładach. Przeczytaj o zagadnieniu, zobacz kod i przećwicz go na ścieżce Coddy.
Zacznij ścieżkę Go z przewodnikiemPierwsze kroki
- Czym jest Go?Go (często nazywany Golang) to statycznie typowany, kompilowany język zaprojektowany w Google do budowania szybkich, niezawodnych serwerów i narzędzi. Ta strona wyjaśnia, czym jest, do czego się go używa i gdzie ma słabsze strony.
- Instalacja GoJak pobrać i zainstalować Go na Windows, macOS i Linux, sprawdzić instalację przez go version, zrozumieć GOPATH i naprawić błąd "go: command not found".
- Hello WorldProgram hello world w Go linia po linii: package main, blok import, func main i fmt.Println, a do tego jak go uruchomić i jakie błędy kompilacji początkujący widzą najpierw.
- go run i go buildCo robią go run, go build i go install, jak Go nazywa plik wykonywalny, jak kompilować na inne platformy przez GOOS i GOARCH oraz jakie sprawdzenia go fmt i go vet uruchomić przed commitem.
- Moduły GoJak działają moduły Go: tworzenie modułu przez go mod init, wybór ścieżki modułu, dodawanie zależności przez go get, porządkowanie przez go mod tidy, do czego służy go.sum i replace przy pracy lokalnej.
- Pakiety i importyJak działają pakiety w Go: klauzula package, importowanie pakietów standardowych i z modułów, nazwy eksportowane i nieeksportowane, podział pakietu na pliki, pakiety internal, aliasy importów, puste importy i błąd "undefined" po go run main.go.
Podstawy
- ZmienneJak deklarować zmienne w Go przez var i krótką formę :=, czym są wartości zerowe, przypisanie wielokrotne oraz błędy przesłaniania i nieużywanych zmiennych, które zaskakują początkujących w Go.
- StałeJak działa const w Go: deklarowanie stałych, różnica między stałymi typowanymi i beztypowymi, wyrażenia stałe o dowolnej precyzji oraz dlaczego Go nie ma stałych slice'ów, map ani struktur.
- Enumy i iotaGo nie ma słowa kluczowego enum. Ta strona pokazuje idiomatyczny zamiennik: nazwany typ plus blok const z iota, a także jak dodać String(), walidację, parsowanie, flagi bitowe i obsługę JSON.
- Typy danychWbudowane typy Go: rozmiary i zakresy liczb całkowitych, float32 i float64, bool, string, byte i rune, liczby zespolone, wartości zerowe oraz wypisywanie typu wartości przez %T.
- Konwersja typówJak konwertować typy w Go: int na string i string na int przez strconv, liczby zmiennoprzecinkowe na całkowite, konwersje liczbowe przez T(v), bajty i rune, pułapka string(65) i obsługa błędów konwersji.
- StringiPraca ze stringami w Go: pakiet strings (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), wydajne budowanie stringów przez strings.Builder, wieloliniowe surowe stringi, niezmienność i dlaczego len liczy bajty.
- Rune i bajtyCo oznaczają rune i byte w Go, jak stringi przechowują UTF-8, dlaczego len liczy bajty, jak range dekoduje rune, konwersje między string, []byte i []rune oraz praca z pakietem bytes.
- fmt.Printf i SprintfJak pakiet fmt w Go wypisuje i formatuje wartości: Println, Printf, Sprintf i Errorf, pełna tabela czasowników formatujących (%v, %+v, %d, %s, %q, %f, %T, %w i inne), szerokość, precyzja i dopełnianie.
Przepływ sterowania
- if / elseJak działają if, else if i else w Go: bez nawiasów, z obowiązkowymi klamrami, if z instrukcją inicjującą i jej zasięg, idiom if err != nil i wczesne powroty zamiast głębokiego zagnieżdżania.
- Pętla forGo ma jedno słowo kluczowe pętli, for, i obejmuje ono wszystko: pętlę z licznikiem i trzema klauzulami, pętlę while z samym warunkiem, pętlę nieskończoną i range po slice'ach, mapach, stringach, kanałach, liczbach i funkcjach. Do tego break i continue z etykietą oraz zmiana zmiennych pętli w Go 1.22.
- Pętla whileGo nie ma słowa kluczowego while. Pętla for z samym warunkiem to while w Go, for bez warunku to pętla nieskończona, a do-while to pętla nieskończona ze sprawdzeniem na końcu.
- Pętle rangeCo zwraca for range dla slice'ów, tablic, stringów, map, kanałów, liczb całkowitych i funkcji iteratorów, dlaczego zmienna wartości jest kopią, co się dzieje przy modyfikowaniu slice'a lub mapy w trakcie range i jak działa range po funkcji w Go 1.23.
- Instrukcja switchJak działa switch w Go: przypadki domyślnie nie przechodzą do następnych, jeden case może wymieniać kilka wartości, switch bez warunku zastępuje łańcuchy if/else, switch z instrukcją inicjalizującą, słowo kluczowe fallthrough i krótkie spojrzenie na type switch.
- Operator trójargumentowyGo nie ma operatora trójargumentowego (cond ? a : b). Ta strona wyjaśnia dlaczego, pokazuje idiomatyczny zamiennik z if/else, cmp.Or do wartości domyślnych oraz generyczną funkcję pomocniczą razem z pułapką, która odróżnia ją od prawdziwego operatora trójargumentowego.
Funkcje
- FunkcjeJak deklarować i wywoływać funkcje w Go: parametry, wspólne typy parametrów, wartości zwracane, przekazywanie przez wartość oraz funkcje jako wartości, które można przechowywać i przekazywać dalej.
- Wiele wartości zwracanychFunkcje w Go mogą zwracać kilka wartości. Ta strona omawia składnię, konwencję (value, error), idiom comma-ok, nazwane wyniki, gołe return i pusty identyfikator.
- Funkcje wariadyczneFunkcja wariadyczna w Go przyjmuje dowolną liczbę końcowych argumentów jednego typu. Poznaj składnię ...T, przekazywanie slice'a przez s..., pułapkę ze współdzieleniem i to, jak fmt.Println używa ...any.
- DomknięciaFunkcje anonimowe w Go mogą przechwytywać zmienne z otaczającego zakresu. Tak powstają domknięcia (closures): liczniki, generatory, middleware i callbacki, które mają własny stan.
- Instrukcja deferdefer planuje wywołanie, które wykona się, gdy otaczająca funkcja zwróci wynik. Poznaj kolejność LIFO, moment ewaluacji argumentów, zamykanie plików i zwalnianie mutexów, defer w pętlach i zmianę nazwanych wyników.
- MetodyMetoda to funkcja z odbiorcą. Dowiedz się, jak deklarować metody, kiedy używać odbiorcy wartościowego, a kiedy wskaźnikowego, czym są zbiory metod i interfejsy i jak dodawać metody do typów, które nie są strukturami.
Kolekcje
- TabliceTablica w Go ma stałą długość, która jest częścią jej typu, i jest kopiowana przy przypisaniu. Zobacz, jak deklarować, przeglądać, porównywać i przekazywać tablice oraz dlaczego większość kodu w Go używa slice'ów.
- Slice'ySlice'y to codzienny typ listy w Go. Poznaj make, append i wzrost, len a cap, to, jak wycinanie współdzieli tablicę bazową (i jaki błąd z tego wynika), copy, pakiet slices, slice'y 2D oraz nil a pusty slice.
- MapyMapy w Go przechowują pary klucz-wartość z szybkim wyszukiwaniem. Dowiedz się, jak je tworzyć, sprawdzać przez comma-ok, czy klucz istnieje, usuwać wpisy, iterować (w losowej kolejności), sortować klucze, przechowywać struktury i unikać panik przy mapie nil i współbieżnych zapisach.
- ZbioryGo nie ma wbudowanego typu zbioru. Standardowy idiom to mapa z pustymi strukturami jako wartościami. Poznaj dodawanie, sprawdzanie i usuwanie, sumę, iloczyn i różnicę zbiorów oraz sposób na napisanie małego generycznego typu Set.
- SortowanieSortuj slice'y w Go przez slices.Sort i slices.SortFunc, sortuj struktury po jednym lub kilku polach z cmp.Compare, zachowaj kolejność równych elementów dzięki sortowaniu stabilnemu i czytaj starszy kod z sort.Slice.
Struktury, interfejsy i typy generyczne
- StrukturyStruktury grupują nazwane pola w jeden typ. Zobacz, jak je definiować i inicjalizować, czym są wartości zerowe, wskaźniki do struktur, struktury anonimowe, porównywanie, tagi struktur i konwencja konstruktora NewX.
- WskaźnikiWskaźnik przechowuje adres wartości. Poznaj & i *, new, wskaźniki do struktur, dowiedz się, dlaczego można bezpiecznie zwrócić wskaźnik do zmiennej lokalnej, kiedy używać wskaźników i skąd bierze się panika nil pointer dereference.
- InterfejsyInterfejsy w Go są spełniane niejawnie: implementuje je każdy typ z odpowiednimi metodami. Poznaj małe interfejsy, takie jak io.Reader i fmt.Stringer, pusty interfejs any, pułapkę interfejsu nil i zasadę: przyjmuj interfejsy, zwracaj struktury.
- Osadzanie strukturOsadzanie (embedding) umieszcza jeden typ w drugim bez nazwy pola, więc jego pola i metody są promowane do typu zewnętrznego. Zobacz, jak działa promocja, osadzanie interfejsów, konflikty nazw i dlaczego osadzanie nie jest dziedziczeniem.
- Asercje typówAsercja typu wydobywa konkretną wartość z interfejsu. Poznaj x.(T), formę comma-ok, która nigdy nie wywołuje panic, asercję do innego interfejsu, type switch i errors.As dla opakowanych błędów.
- GenerykiGeneryki (Go 1.18+) pozwalają jednej funkcji lub jednemu typowi działać z wieloma typami przy zachowaniu bezpieczeństwa typów. Poznaj parametry typów, ograniczenia any, comparable i cmp.Ordered, własne ograniczenia z ~, typy generyczne i sytuacje, w których lepiej ich nie używać.
Błędy
- Obsługa błędówGo obsługuje błędy jako zwykłe wartości zwracane z funkcji. Poznaj interfejs error, if err != nil, errors.New i fmt.Errorf, zwracanie błędów z kontekstem, sprawdzanie ich przez errors.Is i errors.As oraz obsługę każdego błędu tylko raz.
- Własne błędyDefiniuj błędy sentinel i własne typy błędów, opakowuj błędy przez %w, sprawdzaj je przez errors.Is i errors.As, łącz kilka przez errors.Join i pisz metody Unwrap oraz Is, gdy ich potrzebujesz.
- panic i recoverPanika zatrzymuje normalne wykonanie i zwija stos, uruchamiając wywołania odroczone. Dowiedz się, co wywołuje paniki, jak recover w funkcji odroczonej je zatrzymuje, jakie komunikaty błędów runtime zobaczysz i kiedy panika jest właściwym wyborem.
Współbieżność
- GoroutinesJak uruchamiać funkcje współbieżnie słowem kluczowym go, czekać na ich zakończenie, odbierać wyniki i unikać wyścigów danych, wycieków i awarii, o które przy gorutynach bardzo łatwo.
- KanałyJak kanały w Go przekazują wartości między gorutynami: kanały niebuforowane i buforowane, zamykanie i range, typy kierunkowe, błąd zakleszczenia (deadlock) i zbudowany z nich pipeline.
- Instrukcja selectJak select czeka na kilka operacji na kanałach jednocześnie: wybór spośród gotowych przypadków, nieblokujące wysyłanie i odbieranie z default, timeouty z time.After oraz zatrzymywanie pętli kanałem quit lub kontekstem.
- WaitGroupJak sync.WaitGroup czeka na zakończenie grupy goroutine: zasady Add, Done i Wait, dlaczego trzeba go przekazywać przez wskaźnik, zbieranie wyników i błędów oraz zbudowana na nim pula workerów.
- MutexJak chronić stan współdzielony między gorutynami przez sync.Mutex i sync.RWMutex, kiedy wystarczy sync/atomic, jak sync.Once wykonuje inicjalizację dokładnie raz i jakie błędy z blokadami prowadzą do zakleszczeń.
- Pakiet contextJak context.Context przenosi anulowanie, terminy i wartości związane z żądaniem przez program w Go: Background, WithCancel, WithTimeout, WithValue, ctx.Done w select oraz context w serwerach i klientach HTTP.
Biblioteka standardowa
- Pakiet timeJak pracować z datami i czasem w Go: time.Now i time.Sleep, arytmetyka na Duration, układ wzorcowy 2006-01-02 15:04:05 dla Format i Parse, strefy czasowe, znaczniki czasu Unix oraz timery i tickery.
- JSONJak kodować i dekodować JSON w Go z encoding/json: Marshal i Unmarshal, tagi struktur takie jak omitempty i omitzero, ładne formatowanie, dekodowanie do map[string]any, odrzucanie nieznanych pól i strumieniowanie przez Decoder.
- Odczyt i zapis plikówJak czytać i zapisywać pliki w Go: os.ReadFile i os.WriteFile, czytanie linia po linii przez bufio.Scanner, dopisywanie przez os.OpenFile, sprawdzanie, czy plik istnieje, i praca z katalogami.
- Serwer HTTPJak zbudować serwer WWW na standardowym pakiecie net/http w Go: handlery, routing ServeMux z metodami i wildcardami w ścieżce (Go 1.22), odpowiedzi JSON, kody statusu, middleware, timeouty i łagodne zamykanie.
- Klient HTTPJak wysyłać żądania HTTP w Go z net/http: http.Get, czytanie i zamykanie body, sprawdzanie kodów statusu, timeouty w http.Client, żądania z kontekstem i nagłówkami, parametry zapytania i wysyłanie JSON metodą POST.
- Argumenty wiersza poleceńJak program w Go czyta wiersz poleceń: os.Args, pakiet flag do typowanych opcji, podkomendy z FlagSet, zmienne środowiskowe przez os.Getenv i os.LookupEnv oraz kody wyjścia przez os.Exit.
- Wyrażenia regularneJak używać wyrażeń regularnych w Go z pakietem regexp: MustCompile, MatchString, FindString i FindAllString, grupy przechwytujące i grupy nazwane, ReplaceAllString oraz ograniczenia składni RE2, na przykład brak lookbehind.
- LogowanieJak logować w Go: klasyczny pakiet log z flagami i log.Fatal oraz log/slog (Go 1.21) do logów strukturalnych z poziomami, atrybutami klucz-wartość, handlerami tekstowymi i JSON oraz loggerami, które niosą kontekst dzięki With.
Testy i struktura projektu
- TestowanieJak testować kod w Go standardowym pakietem testing i poleceniem go test: pliki _test.go, funkcje TestXxx, t.Errorf a t.Fatalf, testy tabelaryczne z t.Run, funkcje pomocnicze i katalogi tymczasowe, pokrycie kodu, benchmarki z b.Loop i testy przykładów.
- Struktura projektuJak ułożyć projekt w Go: zacznij płasko, dziel na pakiety, gdy jest powód, używaj cmd/ dla wielu binarek i internal/ dla kodu, którego nikt inny nie może importować, dobrze nazywaj pakiety i trzymaj testy obok kodu.