Go Academy · Lekcja

new() i kiedy używać wskaźników

Alokowanie za pomocą new i typowe wzorce użycia wskaźników

Lekcja 4 z 413 kroki

new() i kiedy używać wskaźników to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 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.

Wbudowana funkcja new()

new(T) alokuje wyzerowaną wartość typu T i zwraca *T. W przypadku struktur jest równoważne &T{}:

package main
import "fmt"

func main() {
    p := new(int)
    fmt.Println(*p)     // 0
    *p = 42
    fmt.Println(*p)     // 42

    type Point struct{ X, Y int }
    pt := new(Point)
    fmt.Println(*pt)    // {0 0}
}

new a &T{}

W przypadku struktur zapis &T{} jest bardziej idiomatyczny i umożliwia inicjalizowanie pól. new jest rzadko używane we współczesnym Go:

package main
import "fmt"

type Config struct{ Port int; Host string }

func main() {
    a := new(Config)          // zeroed
    b := &Config{Port: 8080}  // initialized
    fmt.Println(a, b)
}

Kiedy zwracać wskaźnik

Zwracaj wskaźnik z konstruktora, gdy:

  • Struktura przechowuje stan i wywołujący muszą współdzielić tę samą instancję
  • Struktura ma metody z odbiorcami wskaźnikowymi (co jest potrzebne do spełniania interfejsów)
  • Struktura jest duża, a kopiowanie byłoby kosztowne

Kiedy zwracać wartość

Zwracaj wartość, gdy:

  • Typ jest mały (ma kilka pól)
  • Jest to niezmienna konfiguracja
  • Chcesz jasno wskazać, że wywołujący otrzymują niezależne kopie

Przykład: time.Time jest zwracany przez wartość mimo wielu metod.

Wskaźniki w wycinkach i mapach

Przechowywanie wskaźników w kolekcjach umożliwia współdzielenie modyfikacji:

package main
import "fmt"

type User struct{ Name string; Score int }

func main() {
    users := []*User{{"Alice", 0}, {"Bob", 0}}
    users[0].Score = 100
    fmt.Println(users[0]) // &{Alice 100}
}

Wskaźnik do typu prostego jako opcjonalność

Pole typu *int lub *string może mieć wartość nil oznaczającą „nieustawione”. Jest to przydatne w przypadku JSON z omitempty lub opcjonalnych kolumn w bazie danych:

package main
import "fmt"

type Profile struct {
    Name string
    Age  *int // nil means not provided
}

func main() {
    p := Profile{Name: "Alice"}
    fmt.Println(p.Age == nil) // true
    age := 30
    p.Age = &age
    fmt.Println(*p.Age) // 30
}

Unikanie nadmiaru wskaźników

Nadmierne używanie wskaźników zwiększa obciążenie modułu GC i zmniejsza lokalność pamięci podręcznej. Przed zamianą typów wartości na wskaźniki wyłącznie ze względów wydajnościowych wykonaj testy porównawcze.

make a new

make inicjalizuje wycinki, mapy i kanały (wymagają one wewnętrznej konfiguracji). new alokuje dowolny typ z wartościami zerowymi i zwraca wskaźnik. Służą do różnych celów:

package main
import "fmt"

func main() {
    s := make([]int, 5)           // usable slice
    m := make(map[string]int)     // usable map
    p := new(int)                 // *int pointing to 0
    fmt.Println(s, m, *p)
}

Wzorzec niezmiennego wskaźnika

Zwracaj *T, ale dokumentuj go jako niezmienny; odbiorcy nie powinni go modyfikować. Jest to częste w obiektach konfiguracji współdzielonych między goroutines.

Podsumowanie bezpieczeństwa wskaźników

Zasady bezpiecznej pracy ze wskaźnikami:

  • Zawsze sprawdzaj nil przed wyłuskaniem wartości
  • Nie przechowuj wskaźników do zmiennych na stosie dłużej niż trwa ich czas życia (analiza ucieczki w Go obsługuje to automatycznie)
  • Nigdy nie rzutuj na unsafe.Pointer, chyba że jest to absolutnie konieczne
  • Pozwól kompilatorowi zarządzać stosem i stertą

Szybkie sprawdzenie

Co zwraca new(int)?

Podsumowanie: new i wskaźniki

Najważniejsze informacje:

  • new(T) zwraca wyzerowane *T — jest rzadko używane; preferuj &T{}
  • Zwracaj wartości, gdy typ jest mały lub niezmienny, a wskaźniki, gdy przechowuje stan lub jest duży
  • Pola typu *T umożliwiają semantykę nil oznaczającego brak wartości
  • Nie nadużywaj wskaźników — GC ma swój koszt

Polecenie ćwiczeniowe

Utwórz strukturę Settings z polem typu *int o nazwie MaxConnections. Napisz funkcję, która przyjmuje *Settings i ustawia wartość domyślną tylko wtedy, gdy pole ma wartość nil.

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 „new() i kiedy używać wskaźników” jest bezpłatna?

Tak — pełny tekst „new() i kiedy używać wskaźników” 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 „new() i kiedy używać wskaźników”?

Alokowanie za pomocą new i typowe wzorce użycia wskaźników Ć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 4 z 4.

Ile czasu zajmuje lekcja „new() i kiedy używać wskaźników”?

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