Menu
Coddy logo textTech

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)   // 0

Moż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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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ę ServerConfig z polami Host (string), Port (int), MaxConnections (int) i DebugMode (bool). Utwórz dwie funkcje:
    • NewServerConfig, która używa new(), aby przydzielić pamięć dla ServerConfig i 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
    Dodaj też metodę Display dla *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żyj ConfigureServer, 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: false

Zwróć 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
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online