Ein Problem, das jeder Entwickler kennt
\n\nStellen Sie sich vor: Sie schreiben einen Log-Parser, verarbeiten Benutzereingaben aus einem Formular oder bereiten Daten für eine API vor. Zeichenketten kommen mit überflüssigen Leerzeichen am Anfang und Ende. Wenn Sie diese nicht entfernen – Bugs, kaputte Vergleiche, schiefes JSON und verlorene Stunden beim Debuggen. Das ist eine klassische Aufgabe, die auf Stack Overflow tausende Aufrufe gesammelt hat. Heute lösen wir sie in Go – schnell, elegant und ohne Überraschungen.
\n\nIn dieser Anleitung erfahren Sie:
\n- \n
- Wie Sie die Standardbibliothek
stringszum Kürzen von Leerzeichen verwenden. \n - Wie sich
TrimSpacevonTrimLeftundTrimRightunterscheidet. \n - Wie Sie Ihre eigene benutzerdefinierte Funktion für nicht standardmäßige Whitespace-Zeichen schreiben. \n
- Wie Sie Fallstricke mit Unicode und Tabulatoren vermeiden. \n
Los geht's!
\n\nSchnellstart: strings.TrimSpace
\n\nDer einfachste und beliebteste Weg, Leerzeichen an beiden Enden einer Zeichenkette zu entfernen, ist die Verwendung der Funktion strings.TrimSpace aus dem Standardpaket strings. Sie entfernt alle Zeichen, die Go als "Leerzeichen" (Whitespace) betrachtet: normale Leerzeichen, Tabulatoren, Zeilenumbrüche, Wagenrückläufe und sogar vertikale Tabulatoren.
So sieht das im Code aus:
\n\npackage main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n raw := " Hallo, Welt! \\n\\t"\n cleaned := strings.TrimSpace(raw)\n \n fmt.Printf("Original: %q\\n", raw)\n fmt.Printf("Bereinigt: %q\\n", cleaned)\n}\n\n\nAusgabe:
\nOriginal: " Hallo, Welt! \\n\\t"\nBereinigt: "Hallo, Welt!"\n\n\nBeachten Sie: %q in fmt.Printf zeigt die Zeichenkette mit Escape-Sequenzen – das ist praktisch zum Debuggen, um versteckte Zeichen zu sehen.
Wann verwenden: In 90% der Fälle reicht das aus. Wenn Sie eine Zeichenkette einfach von überflüssigen Zeichen an den Rändern "bereinigen" müssen – nehmen Sie TrimSpace.
Feinabstimmung: TrimLeft und TrimRight
\n\nManchmal müssen Sie Leerzeichen nur links oder nur rechts entfernen. Dafür gibt es in Go strings.TrimLeft und strings.TrimRight. Aber es gibt einen Haken: Sie arbeiten standardmäßig nicht mit "Leerzeichen", sondern mit einem übergebenen Zeichensatz.
Beispiel:
\n\npackage main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n s := " \\t\\n Hallo "\n \n // Nur links kürzen (Leerzeichen, Tabulatoren, Zeilenumbrüche)\n left := strings.TrimLeft(s, " \\t\\n")\n fmt.Printf("Links: %q\\n", left)\n \n // Nur rechts kürzen (nur Leerzeichen)\n right := strings.TrimRight(s, " ")\n fmt.Printf("Rechts: %q\\n", right)\n}\n\n\nAusgabe:
\nLinks: "Hallo "\nRechts: " \\t\\n Hallo"\n\n\nWichtig: TrimLeft und TrimRight entfernen alle Zeichen aus dem zweiten Argument, bis sie auf ein Zeichen stoßen, das nicht darin enthalten ist. Wenn Sie nur das Leerzeichen " " angeben, bleibt der Tabulator \\t unberührt.
Analog zu TrimSpace für eine Seite
\n\nWenn Sie alle Whitespace-Zeichen nur links oder nur rechts entfernen müssen, aber keine Lust haben, alle Zeichen aufzulisten, können Sie einen kleinen Wrapper schreiben:
\n\nfunc trimLeftSpace(s string) string {\n return strings.TrimLeft(s, " \\t\\n\\r\\v\\f")\n}\n\nfunc trimRightSpace(s string) string {\n return strings.TrimRight(s, " \\t\\n\\r\\v\\f")\n}\n\n\nOder, für diejenigen, die Kürze lieben, strings.TrimSpace mit einem Trick verwenden:
// Nur links kürzen: zuerst umkehren, dann TrimSpace, dann wieder umkehren\nfunc trimLeftSpace(s string) string {\n runes := []rune(s)\n for i, r := range runes {\n if !unicode.IsSpace(r) {\n return string(runes[i:])\n }\n }\n