Funkcja new()
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 22 z 107.
Go udostępnia wbudowaną funkcję o nazwie new(), która przydziela pamięć dla typu i zwraca do niej wskaźnik. Przydzielona pamięć jest inicjalizowana wartością zerową tego typu.
p := new(int) // przydziela pamięć dla wartości typu int
fmt.Println(*p) // 0 (wartość zerowa)
fmt.Println(p) // 0xc000018030 (adres pamięci)Funkcja new() przyjmuje typ jako argument i zwraca wskaźnik do nowo przydzielonej wartości zerowej tego typu. Jest to szczególnie przydatne, gdy potrzebujesz wskaźnika, ale nie masz istniejącej zmiennej, do której mógłby się odwoływać.
W przypadku struktur new() tworzy wskaźnik do struktury, której wszystkie pola mają wartości zerowe.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (pusty ciąg znaków)
fmt.Println(p.Age) // 0Możesz się zastanawiać, kiedy używać new(), a kiedy operatora adresu &. Oba poniższe podejścia są równoważne:
// Użycie new()
p1 := new(Person)
// Użycie operatora pobrania adresu z literałem
p2 := &Person{}Składnia &Person{} jest częściej stosowana w praktyce, ponieważ pozwala jednocześnie inicjalizować pola. Użyj new(), gdy zależy ci konkretnie na instancji o zerowych wartościach i preferujesz jawne semantyki alokacji pamięci.
Wyzwanie
ŁatwyZbudujmy menedżer konfiguracji, który pokazuje, jak new() przydziela pamięć i inicjalizuje struktury wartościami zerowymi. Zobaczysz, czym to podejście różni się od użycia operatora adresu ze składnią literału struktury.
Rozmieścisz swój kod w dwóch plikach:
config.go: Zdefiniuj strukturęServerConfigz polamiHost(string),Port(int),MaxConnections(int) iDebugMode(bool). Utwórz dwie funkcje:NewServerConfig, która używanew(), aby przydzielić pamięć dlaServerConfigi bezpośrednio zwraca wskaźnik (ze wszystkimi wartościami zerowymi)ConfigureServer, która przyjmuje wskaźnik*ServerConfig, a także ciąg znaków z nazwą hosta i liczbę całkowitą oznaczającą port, a następnie ustawia te pola konfiguracji za pośrednictwem wskaźnika
Displaydla*ServerConfig, która zwraca sformatowany ciąg znaków przedstawiający wszystkie wartości konfiguracji.main.go: Odczytaj nazwę hosta i port z wejścia. Najpierw utwórz konfigurację za pomocąNewServerConfig()i wyświetl ją, aby pokazać wartości zerowe. Następnie użyjConfigureServer, aby ustawić nazwę hosta i port, po czym ponownie wyświetl konfigurację, aby pokazać zaktualizowane wartości.
Zostaną podane następujące dane wejściowe:
- Wiersz 1: Nazwa hosta (string)
- Wiersz 2: Numer portu (liczba całkowita)
Metoda Display powinna zwracać ciąg znaków w dokładnie takim formacie:
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]Wyświetl wynik dwukrotnie: raz przed konfiguracją (pokazując wartości zerowe) i raz po konfiguracji (pokazując zaktualizowaną nazwę hosta i port).
Na przykład, dla danych localhost i 8080 wynik powinien wyglądać następująco:
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: falseZwróć uwagę, że pierwsze wyświetlenie pokazuje wszystkie wartości zerowe (pusty ciąg znaków, 0, 0, false), ponieważ new() inicjalizuje wszystko wartościami zerowymi. Po wywołaniu ConfigureServer zmieniają się tylko nazwa hosta i port, a pozostałe pola zachowują wartości zerowe.
Spróbuj swoich sił
package main
import (
"fmt"
)
func main() {
// Odczytaj dane wejściowe
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: Utwórz konfigurację za pomocą NewServerConfig() i ją wyświetl
// Wyświetli to wartości zerowe
// TODO: Użyj ConfigureServer, aby ustawić host i port
// TODO: Wyświetl konfigurację ponownie, aby pokazać zaktualizowane wartości
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania koduPoćwicz samodzielnie: Kompilator Go online