new() und wann Pointer verwendet werden
Allokation mit new und gängige Pointer-Patterns
new() und wann Pointer verwendet werden ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Das eingebaute new()
new(T) alloziert ein mit dem Nullwert initialisiertes T und gibt einen *T zurück. Bei Structs entspricht dies &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 im Vergleich zu &T{}
Bei Structs ist &T{} idiomatischer und ermöglicht die Initialisierung von Feldern. new wird in modernem Go nur selten verwendet:
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)
}Wann ein Pointer zurückgegeben wird
Geben Sie aus einem Konstruktor einen Pointer zurück, wenn:
- der Struct zustandsbehaftet ist und Aufrufer dieselbe Instanz gemeinsam verwenden müssen
- der Struct Methoden mit Pointer-Receivern besitzt (für die Erfüllung von Interfaces erforderlich)
- der Struct groß ist und Kopien aufwendig wären
Wann ein Wert zurückgegeben wird
Geben Sie einen Wert zurück, wenn:
- der Typ klein ist (einige Felder)
- es sich um eine unveränderliche Konfiguration handelt
- Sie deutlich machen möchten, dass Aufrufer unabhängige Kopien erhalten
Beispiel: time.Time wird trotz seiner vielen Methoden als Wert zurückgegeben.
Pointer in Slices und Maps
Das Speichern von Pointern in Sammlungen ermöglicht, dass Änderungen gemeinsam sichtbar sind:
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}
}Pointer auf primitive Typen für optionale Werte
Ein Feld vom Typ *int oder *string kann nil sein, um „nicht gesetzt“ zu bedeuten; das ist nützlich für JSON mit omitempty oder optionale DB-Spalten:
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
}Pointer-Vermehrung vermeiden
Eine übermäßige Verwendung von Pointern erhöht den Druck auf den GC und verringert die Cache-Lokalität. Führen Sie Benchmarks durch, bevor Sie Werttypen aus reinen Performance-Gründen in Pointer umwandeln.
make im Vergleich zu new
make initialisiert Slices, Maps und Channels (sie benötigen eine interne Initialisierung). new setzt jeden Typ auf den Nullwert und gibt einen Pointer zurück. Beide dienen unterschiedlichen Zwecken:
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)
}Muster für unveränderliche Pointer
Geben Sie *T zurück, dokumentieren Sie ihn aber als unveränderlich; Konsumenten sollten ihn nicht ändern. Dies ist bei Konfigurationsobjekten üblich, die von mehreren Goroutinen gemeinsam genutzt werden.
Zusammenfassung zur Pointer-Sicherheit
Regeln für einen sicheren Umgang mit Pointern:
- Prüfen Sie vor dem Dereferenzieren immer auf nil
- Speichern Sie Pointer auf Stack-Variablen nicht länger als deren Lebensdauer (Go's Escape-Analyse kümmert sich darum)
- Casten Sie
unsafe.Pointerniemals, außer wenn dies unbedingt erforderlich ist - Überlassen Sie dem Compiler die Verwaltung von Stack und Heap
Kurztest
Was gibt new(int) zurück?
Zusammenfassung: new und Pointer
Wichtige Erkenntnisse:
new(T)gibt einen auf den Nullwert gesetzten*Tzurück – wird selten verwendet; bevorzugen Sie&T{}- Geben Sie Werte zurück, wenn sie klein oder unveränderlich sind, Pointer hingegen bei zustandsbehafteten oder großen Typen
- Felder vom Typ
*Termöglichen die Semantik „nil bedeutet nicht vorhanden“ - Vermeiden Sie eine übermäßige Verwendung von Pointern – der GC verursacht dadurch Kosten
Übungsaufgabe
Erstellen Sie ein Settings-Struct mit einem *int-Feld für MaxConnections. Schreiben Sie eine Funktion, die *Settings entgegennimmt und nur dann einen Standardwert setzt, wenn das Feld nil ist.
Häufig gestellte Fragen
Ist die Lektion „new() und wann Pointer verwendet werden“ kostenlos?
Ja — der vollständige Text von „new() und wann Pointer verwendet werden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „new() und wann Pointer verwendet werden“?
Allokation mit new und gängige Pointer-Patterns Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „new() und wann Pointer verwendet werden“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Was sind Pointer?
- Pointer und Funktionen
- Pointer-Receiver für Methoden
- new() und wann Pointer verwendet werden