new() i kiedy używać wskaźników
Alokowanie za pomocą new i typowe wzorce użycia wskaźników
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
nilprzed 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
*Tumoż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.
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
- Czym są wskaźniki?
- Wskaźniki i funkcje
- Odbiorniki wskaźnikowe metod
- new() i kiedy używać wskaźników