Warum es in Go keine Standardparameter gibt (und das ist gut so)
Stellen Sie sich vor: Sie programmieren in Go und möchten eine Methode mit einem Parameter erstellen, der nicht angegeben werden muss. Also, wie in Python: def greet(name="Gast"). Sie greifen zur Tastatur und schreiben:
func (u *User) Greet(message string = "Hallo") string { return message + ", " + u.Name}Und dann gibt Go einen Fehler aus. Der Compiler wird rot, lässt es aber nicht durch. Kommt Ihnen das bekannt vor? Diese Frage (das Original auf Stack Overflow hat tausende Aufrufe) quält jeden zweiten Anfänger in Go. Die Sprachentwickler haben bewusst auf Standardwerte verzichtet. Warum? Weil Go eine Sprache der Eindeutigkeit ist. Lesbarkeit des Codes ist wichtiger als Kürze. Aber das bedeutet nicht, dass Sie keinen Standardwert in Go nachbilden können. Es gibt mindestens 5 elegante Wege. Lassen Sie uns jeden durchgehen.
Methode 1: Überladung durch verschiedene Funktionen (Go-Way)
Der einfachste und "Go-ischste" Ansatz ist, einfach zwei Funktionen zu erstellen. Eine mit Parameter, eine ohne.
type Config struct { Timeout int}
func NewDefaultConfig() *Config { return &Config{Timeout: 30} // Standardwert}
func NewConfig(timeout int) *Config { if timeout <= 0 { timeout = 30 // Schutz vor dummen Fehlern } return &Config{Timeout: timeout}}Vorteile: Äußerst klar, in einer Sekunde lesbar.
Nachteile: Bei 3-4 Parametern führt dies zu einer Explosion von Funktionen.
Methode 2: Struktur mit Konstruktor (Builder Pattern)
Wenn es viele Parameter gibt (3+), kommt das Builder Pattern zur Hilfe. Dies ist eine Standard-Idiom in Go für die Arbeit mit optionalen Parametern.
type Server struct { Host string Port int Timeout time.Duration MaxConn int}
// Standardwertefunc NewServer() *Server { return &Server{ Host: "localhost", Port: 8080, Timeout: 30 * time.Second, MaxConn: 100, }}
// Setter-Methoden geben das Objekt selbst zurückfunc (s *Server) WithHost(host string) *Server { s.Host = host return s}
func (s *Server) WithPort(port int) *Server { s.Port = port return s}
// Verwendungserver := NewServer(). WithPort(9090). WithTimeout(10 * time.Second)Dieses Pattern wird in der Standardbibliothek von Go aktiv verwendet (z.B. http.Server). Es löst das Problem der Standardparameter in Go ohne Hacks.
Methode 3: Variadic Parameters (überraschender Trick)
Man kann variadische Parameter (das ...-Zeichen) verwenden. Dies ist ein nicht offensichtlicher, aber funktionierender Trick für einen optionalen Parameter.
func Greet(name string, opts ...string) string { greeting := "Hallo" // Standardwert if len(opts) > 0 { greeting = opts[0] } return greeting + ", " + name}
// Verwendungfmt.Println(Greet("Ivan")) // "Hallo, Ivan"fmt.Println(Greet("Maria", "Guten Tag")) // "Guten Tag, Maria"Funktioniert, sieht aber wie ein Workaround aus. Verwenden Sie es nur, wenn Sie eine schnelle Lösung brauchen.
Methode 4: Functional Options (der Go-ischste Weg)
Dies ist die Parade-Disziplin der Go-Entwickler. Erstmals populär gemacht von Dave Cheney. Ermöglicht es, Standardwerte in Go für eine beliebige Anzahl von Parametern festzulegen.
type Option func(*Client)
type Client struct { URL string Timeout time.Duration Retries int}
// Standardwertefunc defaultClient() *Client { return &Client{ URL: "https://api.example.com", Timeout: 10 * time.Second, Retries: 3, }}
// Optionenfunc WithURL(url string) Option { return func(c *Client) { c.URL = url }}
func WithTimeout(t time.Duration) Option { return func(c *Client) {