Go Academy · Lekcja

Czym są wskaźniki?

Operator pobrania adresu, dereferencja i wskaźniki nil

Lekcja 1 z 413 kroki

Czym są wskaźniki? to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Adresy pamięci

Każda zmienna znajduje się pod określonym adresem pamięci. Wskaźnik przechowuje ten adres. W języku Go wskaźniki mają określony typ: *int przechowuje adres wartości typu int.

Operator pobrania adresu &

Należy użyć &, aby pobrać adres zmiennej:

package main
import "fmt"

func main() {
    x := 42
    p := &x
    fmt.Println(p)  // 0xc000... (address)
    fmt.Println(*p) // 42 (value at address)
}

Dereferencja *

Należy użyć *, aby odczytać lub zapisać wartość znajdującą się pod adresem wskaźnika:

package main
import "fmt"

func main() {
    n := 10
    p := &n
    *p = 99
    fmt.Println(n) // 99
}

Wskaźniki nil

Wartością zerową wskaźnika jest nil. Dereferencja wskaźnika nil powoduje panic:

package main
import "fmt"

func main() {
    var p *int
    fmt.Println(p)        // <nil>
    fmt.Println(p == nil) // true
    // *p = 1 — PANIC
}

Typy wskaźnikowe

Każdy typ wskaźnikowy wskazuje konkretny typ wartości:

package main
import "fmt"

func main() {
    i := 1
    s := "hello"
    pi := &i   // *int
    ps := &s   // *string
    fmt.Printf("%T %T\n", pi, ps) // *int *string
}

Sprawdzanie nil przed użyciem

Zawsze należy sprawdzić, czy wskaźnik otrzymany spoza kodu nie ma wartości nil, zanim zostanie wykonana jego dereferencja:

package main
import "fmt"

func printInt(p *int) {
    if p == nil {
        fmt.Println("nil pointer")
        return
    }
    fmt.Println(*p)
}

func main() {
    v := 7
    printInt(&v)
    printInt(nil)
}

Wskaźniki do struct

Dostęp do pól struct przez wskaźnik wykorzystuje tę samą notację kropkową — Go automatycznie wykonuje dereferencję:

package main
import "fmt"

type Point struct{ X, Y int }

func main() {
    p := &Point{1, 2}
    p.X = 10         // same as (*p).X = 10
    fmt.Println(*p)  // {10 2}
}

Porównywanie wskaźników

Dwa wskaźniki są równe, gdy wskazują tę samą zmienną (ten sam adres) lub gdy oba mają wartość nil:

package main
import "fmt"

func main() {
    a := 1
    p1 := &a
    p2 := &a
    p3 := new(int)
    *p3 = 1
    fmt.Println(p1 == p2) // true  — same address
    fmt.Println(p1 == p3) // false — different address
}

Stos a sterta

Kompilator Go decyduje, czy zmienna znajduje się na stosie, czy na stercie, korzystając z analizy ucieczki. Gdy pobierany jest adres zmiennej lokalnej i zwracany na zewnątrz, Go automatycznie przenosi ją na stertę — nie trzeba zarządzać tym ręcznie.

Kiedy NIE używać wskaźników

Nie wszystko wymaga użycia wskaźnika:

  • Małe typy wartościowe (int, bool, małe struct) są tańsze do kopiowania niż do dereferencji
  • Niezmienne dane współdzielone między goroutines są bezpieczne jako wartości
  • Wskaźników należy używać przede wszystkim do modyfikowania danych lub w przypadku dużych struct

Szybkie sprawdzenie

Co zwraca operator &?

Podsumowanie: wskaźniki

Najważniejsze informacje:

  • &v pobiera adres, a *p wykonuje dereferencję
  • Wartością zerową jest nil — przed dereferencją zawsze należy sprawdzić tę wartość
  • Go automatycznie wykonuje dereferencję przy dostępie do pól struct przez wskaźnik
  • Analiza ucieczki automatycznie zarządza umieszczaniem danych na stosie lub stercie

Polecenie do przećwiczenia

Należy napisać funkcję swap(a, b *int), która zamienia wartości dwóch liczb całkowitych za pomocą wskaźników. Należy wywołać ją z funkcji main i wyświetlić wartości przed zamianą oraz po niej.

Bezpłatny start

Ucz się Go dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Czym są wskaźniki?” jest bezpłatna?

Tak — pełny tekst „Czym są wskaźniki?” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Czym są wskaźniki?”?

Operator pobrania adresu, dereferencja i wskaźniki nil Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Czym są wskaźniki?”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Czym są wskaźniki?
  2. Wskaźniki i funkcje
  3. Odbiorniki wskaźnikowe metod
  4. new() i kiedy używać wskaźników
← Powrót do Go Academy