Konstruktoren in Go: Best Practices 2025, von denen die Doku schweigt

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Konstruktoren in Go: keine „Konstruktoren“, sondern etwas Besseres



Wenn Sie aus der Welt von Python, Java oder C++ zu Go kommen, wird Sie wahrscheinlich als Erstes schockieren, dass es in Go keine Konstruktoren gibt. Überhaupt. Kein __init__, ClassName() oder new MyStruct() mit automatischem Aufruf.



Aber keine Panik. Das ist kein Bug, sondern ein Feature. Im Jahr 2025 hat die Go-Community endgültig die Best Practices für die Objektinitialisierung formuliert. Und sie sind so elegant, dass Sie klassische Konstruktoren nicht mehr vermissen werden.



In diesem Artikel behandeln wir:

  • Warum es in Go keine Konstruktoren gibt und warum das großartig ist
  • Wie man sie ohne Schmerz emuliert
  • Factory-Funktionen, Builder Pattern und Fluent-Interfaces
  • Anfängerfehler und Antipatterns
  • Reale Beispiele aus dem Code von 2025


Los geht's!



Warum gibt es in Go keine Konstruktoren? (Spoiler: Das ist eine bewusste Entscheidung)



Die Designer von Go (Rob Pike, Ken Thompson und andere) haben bewusst auf Konstruktoren verzichtet. Warum?



  • Einfachheit. Konstruktoren erzeugen oft versteckte Logik, Magie und implizite Aufrufe. Go ist eine Sprache, in der explizit besser als implizit ist.
  • Kontrolle. Sie entscheiden selbst, wann und wie Sie eine Struktur initialisieren. Es gibt keine versteckten Zustände.
  • Nullwerte. In Go hat jede Variable immer einen Standardwert (Nullwert). Das bedeutet, dass var user User bereits ein gültiges Objekt ist, mit dem gearbeitet werden kann.


Aber das bedeutet nicht, dass Sie keine Funktionen schreiben können, die Objekte erstellen und konfigurieren. Das können Sie! Und das sollten Sie auch. Sie heißen nur nicht „Konstruktoren“, sondern Factory-Funktionen.



Grundlegende Methode: Factory-Funktion (NewXXX)



Das häufigste Pattern ist eine Funktion, die mit New beginnt. Sie gibt einen Zeiger auf eine Struktur zurück und stellt sicher, dass das Objekt korrekt erstellt wurde.



package main

import "fmt"

// User — einfache Strukturtype User struct { Name string Email string Age int}

// NewUser — Factory-Funktion (Konstruktor)func NewUser(name string, email string, age int) *User { return &User{ Name: name, Email: email, Age: age, }}

func main() { user := NewUser("Alice", "alice@example.com", 30) fmt.Println(user.Name) // Alice}


Das ist der Klassiker. Aber was ist, wenn es viele Parameter gibt? 5, 10, 15? Sie der Reihe nach zu übergeben, ist ein Weg zu Bugs. Hier kommen optionale Parameter ins Spiel.



Beste Praxis 2025: Funktionale Optionen (Functional Options)



Im Jahr 2025 sind funktionale Optionen (functional options) der De-facto-Standard für die Konfiguration komplexer Objekte in Go. Das Pattern wurde von Dave Cheney populär gemacht und passt perfekt in die Sprachphilosophie.



Die Idee: Sie übergeben der Factory Funktions-Optionen, die die Struktur vor der Rückgabe modifizieren.



package main

import "fmt"

type Server struct { Host string Port int Timeout int // in Sekunden TLS bool}

// Option — funktionaler Typ für Optionentype Option func(*Server)

// WithTimeout — Option zum Setzen des Timeoutsfunc WithTimeout(t int) Option { return func(s *Server) { s.Timeout = t }}

// WithTLS — Option zum Aktivieren von TLSfunc WithTLS(enabled bool) Option { return func(s *Server) { s.TLS = enabled }}

// NewServer — Factory mit Optionenfunc NewServer(host string, port int, opts ...Option) *Server { // Basis-Standardwerte s := &Server{ Host: host, Port: port, Timeout: 30, // Standard TLS: false, } // Optionen anwenden for _, opt := range opts { opt(s) } return s}\

Blogs

Buchempfehlungen