0Pricing
Go Academy · Lektion

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.Pointer niemals, 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 *T zurü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 *T ermö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

  1. Was sind Pointer?
  2. Pointer und Funktionen
  3. Pointer-Receiver für Methoden
  4. new() und wann Pointer verwendet werden
← Zurück zu Go Academy