Go Cheat Sheet: ściąga z Golanga
Ostatnia aktualizacja
Hello World i struktura programu
Każdy program w Go należy do pakietu; punktem wejścia jest func main w pakiecie main.
| Operacja | Składnia |
|---|---|
| Deklaracja pakietu | package main |
| Import pakietu | import "fmt" |
| Import wielu pakietów | import (\n "fmt"\n "os"\n) |
| Punkt wejścia | func main() { ... } |
| Wypisanie linii | fmt.Println("Hello, World!") |
| Wypisanie z formatowaniem | fmt.Printf("%d items\n", n) |
| Uruchomienie pliku | go run main.go |
| Zbudowanie pliku wykonywalnego | go build |
Zmienne i typy
Go jest typowany statycznie, ale z := sam wnioskuje typy.
| Operacja | Składnia |
|---|---|
| Deklaracja z typem | var age int = 30 |
| Deklaracja z wnioskowaniem | var name = "Ada" |
| Krótka deklaracja | count := 0 |
| Kilka naraz | x, y := 1, 2 |
| Stała | const Pi = 3.14 |
| Wartości zerowe | 0, "", false, nil |
| Podstawowe typy | int, float64, string, bool, byte, rune |
| Konwersja typów | f := float64(i) |
Sterowanie przepływem
Go ma tylko jedno słowo kluczowe pętli, for, i nie używa nawiasów wokół warunków.
| Operacja | Składnia |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| If z instrukcją inicjalizującą | if v, ok := m[k]; ok { ... } |
| Pętla for (w stylu C) | for i := 0; i < 10; i++ { ... } |
| Pętla w stylu while | for x < 100 { ... } |
| Pętla nieskończona | for { ... } |
| Range po slice | for i, v := range items { ... } |
| Switch | switch day { case 1: ...; default: ... } |
| Switch bez wyrażenia | switch { case x > 0: ... } |
| Break / continue | break, continue |
Funkcje
Funkcje są wartościami pierwszej klasy i mogą zwracać wiele wyników.
| Operacja | Składnia |
|---|---|
| Podstawowa funkcja | func add(a int, b int) int { return a + b } |
| Wspólny typ parametrów | func add(a, b int) int { ... } |
| Wiele wartości zwracanych | func divmod(a, b int) (int, int) { return a / b, a % b } |
| Nazwane wartości zwracane | func split(sum int) (x, y int) { x = sum / 2; return } |
| Funkcja o zmiennej liczbie argumentów | func sum(nums ...int) int { ... } |
| Funkcja anonimowa | f := func() { ... } |
| Domknięcie | func counter() func() int { ... } |
| Defer (wykonuje się przy powrocie) | defer file.Close() |
Slice'y i tablice
Tablice mają stały rozmiar; slice'y to dynamiczne widoki na tablice.
| Operacja | Składnia |
|---|---|
| Tablica o stałym rozmiarze | var a [3]int |
| Literał slice'a | nums := []int{1, 2, 3} |
| Utworzenie slice'a | s := make([]int, 0, 10) |
| Dołączenie | s = append(s, 4) |
| Długość / pojemność | len(s), cap(s) |
| Wycinek slice'a | s[1:3] |
| Kopiowanie | copy(dst, src) |
| Iteracja | for i, v := range s { ... } |
Mapy
Mapy to wbudowane w Go tablice mieszające.
| Operacja | Składnia |
|---|---|
| Utworzenie mapy | m := make(map[string]int) |
| Literał mapy | m := map[string]int{"a": 1, "b": 2} |
| Ustawienie wartości | m["c"] = 3 |
| Pobranie wartości | v := m["a"] |
| Sprawdzenie istnienia | v, ok := m["x"] |
| Usunięcie klucza | delete(m, "a") |
| Długość | len(m) |
| Iteracja | for k, v := range m { ... } |
Struktury i metody
Struktury grupują pola; metody dodają zachowanie przez odbiorcę (receiver).
| Operacja | Składnia |
|---|---|
| Definicja struktury | type Point struct { X, Y int } |
| Utworzenie instancji | p := Point{X: 1, Y: 2} |
| Dostęp do pola | p.X |
| Wskaźnik na strukturę | p := &Point{1, 2} |
| Metoda z odbiorcą wartościowym | func (p Point) Dist() float64 { ... } |
| Metoda z odbiorcą wskaźnikowym | func (p *Point) Move(dx int) { p.X += dx } |
| Struktura osadzona | type Circle struct { Point; R int } |
| Tagi struktur | Name string z tagiem json:"name" w odwrotnych apostrofach |
Interfejsy
Interfejsy są spełniane niejawnie: kwalifikuje się każdy typ z odpowiednimi metodami.
| Operacja | Składnia |
|---|---|
| Definicja interfejsu | type Shape interface { Area() float64 } |
| Implementacja (niejawna) | func (c Circle) Area() float64 { ... } |
| Pusty interfejs (any) | var x interface{} lub var x any |
| Asercja typu | s, ok := x.(string) |
| Switch po typie | switch v := x.(type) { case int: ... } |
| Interfejs Stringer | func (p Point) String() string { ... } |
Gorutyny i kanały
Gorutyny to lekkie wątki; kanały przekazują między nimi wartości.
| Operacja | Składnia |
|---|---|
| Uruchomienie gorutyny | go doWork() |
| Utworzenie kanału | ch := make(chan int) |
| Kanał buforowany | ch := make(chan int, 5) |
| Wysłanie do kanału | ch <- 42 |
| Odbiór z kanału | v := <-ch |
| Zamknięcie kanału | close(ch) |
| Range po kanale | for v := range ch { ... } |
| Select na kanałach | select { case v := <-ch: ...; default: ... } |
| WaitGroup | var wg sync.WaitGroup; wg.Add(1); wg.Wait() |
| Mutex | var mu sync.Mutex; mu.Lock(); mu.Unlock() |
Obsługa błędów
Go zwraca błędy jako wartości: nie ma wyjątków.
| Operacja | Składnia |
|---|---|
| Zwrócenie błędu | func read() (string, error) { return "", err } |
| Sprawdzenie błędu | if err != nil { return err } |
| Utworzenie błędu | errors.New("not found") |
| Błąd z formatowaniem | fmt.Errorf("bad id %d", id) |
| Opakowanie błędu | fmt.Errorf("load: %w", err) |
| Rozpakowanie / dopasowanie | errors.Is(err, os.ErrNotExist) |
| Dopasowanie po typie | errors.As(err, &target) |
| Panic / recover | defer func() { recover() }() |
Najczęściej używana składnia Go na jednej stronie. Ten Go cheat sheet to szybka ściąga z podstaw języka: zmienne i typy, slice'y i mapy, struktury i interfejsy, a do tego gorutyny i kanały, dzięki którym Golang błyszczy we współbieżności.
Wszystko tutaj to standardowy Go, który kompiluje się oficjalnym zestawem narzędzi. Skopiuj to, czego potrzebujesz, albo uruchom każdy fragment w edytorze online Go, bez instalacji. Uczysz się Go? Darmowy interaktywny kurs Go w Coddy krok po kroku omawia slice'y, struktury, interfejsy i gorutyny.
Go cheat sheet: najczęstsze pytania
Czy ten Go cheat sheet jest darmowy?
Czym różni się := od var w Go?
var x = 0 deklaruje zmienną i działa wszędzie, także na poziomie pakietu. x := 0 to krótka deklaracja zmiennej: jednocześnie deklaruje i przypisuje, wnioskuje typ i można jej używać tylko wewnątrz funkcji. Używaj var, gdy potrzebujesz jawnego typu albo zmiennej na poziomie pakietu, a := do zwięzłych deklaracji lokalnych.Czym są gorutyny i kanały?
go someFunc(). Kanały to typowane łącza, dzięki którym gorutyny bezpiecznie się komunikują: jedna gorutyna wysyła przez ch <- v, a druga odbiera przez <-ch. Razem tworzą podstawowy model współbieżności Go, streszczony w powiedzeniu "dziel się pamięcią, komunikując się".