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) // 0Du 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.
Aufgabe
EinfachErstellen 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 eineServerConfig-Struktur mit den FeldernHost(string),Port(int),MaxConnections(int) undDebugMode(bool). Erstelle zwei Funktionen:NewServerConfig, dienew()verwendet, um eineServerConfigzu 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
Display-Methode für*ServerConfighinzu, die eine formatierte Zeichenkette mit allen Konfigurationswerten zurückgibt.main.go: Lies einen Host und einen Port aus der Eingabe. Erstelle zunächst mitNewServerConfig()eine Konfiguration und zeige sie an, um die Nullwerte darzustellen. Verwende anschließendConfigureServer, 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: falseBeachte, 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
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker PoolÜbe selbstständig: Online-Go-Compiler