Menu
Coddy logo textTech

Die Funktion new()

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 22 von 107.

Go bietet eine integrierte Funktion namens new(), die Speicher für einen Typ reserviert und einen Zeiger darauf zurückgibt. Der reservierte Speicher wird mit dem Nullwert des Typs initialisiert.

p := new(int)      // allokiert Speicher für ein int
fmt.Println(*p)    // 0 (Nullwert)
fmt.Println(p)     // 0xc000018030 (Speicheradresse)

Die Funktion new() nimmt einen Typ als Argument entgegen und gibt einen pointer auf einen neu allokierten Nullwert dieses Typs zurück. Das ist besonders nützlich, wenn du einen pointer benötigst, aber keine vorhandene Variable hast, auf die du verweisen kannst.

Bei Structs erstellt new() einen Zeiger auf einen Struct, bei dem alle Felder auf ihre Nullwerte gesetzt sind.

type Person struct {
    Name string
    Age  int
}

p := new(Person)
fmt.Println(p.Name)  // "" (leerer String)
fmt.Println(p.Age)   // 0

Du fragst dich vielleicht, wann du new() anstelle des Adressoperators & verwenden solltest. Die beiden folgenden Ansätze sind gleichwertig:

// Verwendung von new()
p1 := new(Person)

// Verwendung des Adressoperators mit Literal
p2 := &Person{}

Die Syntax &Person{} ist in der Praxis gebräuchlicher, weil sie dir ermöglicht, Felder gleichzeitig zu initialisieren. Verwende new(), wenn du ausdrücklich eine Instanz mit Nullwerten möchtest und explizite Semantik der Speicherzuweisung bevorzugst.

challenge icon

Aufgabe

Einfach

Erstellen wir einen Konfigurationsmanager, der demonstriert, wie new() Speicher reserviert und Strukturen mit ihren Nullwerten initialisiert. Du wirst sehen, wie sich dieser Ansatz von der Verwendung des Adressoperators mit einem Strukturliteral unterscheidet.

Du wirst deinen Code auf zwei Dateien verteilen:

  • config.go: Definiere eine ServerConfig-Struktur mit den Feldern Host (string), Port (int), MaxConnections (int) und DebugMode (bool). Erstelle zwei Funktionen:
    • NewServerConfig, die new() verwendet, um eine ServerConfig zu reservieren, und den Zeiger direkt zurückgibt (mit allen Nullwerten)
    • ConfigureServer, die einen *ServerConfig-Zeiger zusammen mit einem Host-String und einer Port-Ganzzahl entgegennimmt und diese Felder der Konfiguration über den Zeiger setzt
    Füge außerdem eine Display-Methode für *ServerConfig hinzu, die eine formatierte Zeichenkette mit allen Konfigurationswerten zurückgibt.
  • main.go: Lies einen Host und einen Port aus der Eingabe. Erstelle zunächst mit NewServerConfig() eine Konfiguration und zeige sie an, um die Nullwerte darzustellen. Verwende anschließend ConfigureServer, um Host und Port zu setzen, und zeige die Konfiguration erneut an, um die aktualisierten Werte darzustellen.

Die folgenden Eingaben werden bereitgestellt:

  • Zeile 1: Hostname (String)
  • Zeile 2: Portnummer (Ganzzahl)

Deine Display-Methode sollte eine Zeichenkette in genau diesem Format zurückgeben:

Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]

Gib die Anzeigeausgabe zweimal aus: einmal vor der Konfiguration (mit den Nullwerten) und einmal nach der Konfiguration (mit dem aktualisierten Host und Port).

Wenn beispielsweise localhost und 8080 angegeben werden, sollte deine Ausgabe wie folgt aussehen:

Host: 
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: false

Beachte, dass die erste Anzeige alle Nullwerte (leere Zeichenkette, 0, 0, false) zeigt, weil new() alles mit Nullwerten initialisiert. Nach dem Aufruf von ConfigureServer ändern sich nur Host und Port, während die anderen Felder ihre Nullwerte behalten.

Probier es selbst

package main

import (
	"fmt"
)

func main() {
	// Eingabe lesen
	var host string
	var port int
	fmt.Scanln(&host)
	fmt.Scanln(&port)

	// TODO: Erstelle eine Config mit NewServerConfig() und zeige sie an
	// Dies zeigt die Nullwerte

	// TODO: Verwende ConfigureServer, um den Host und Port zu setzen

	// TODO: Zeige die Config erneut an, um die aktualisierten Werte anzuzeigen
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Go-Compiler