Konvertierung von Strings in Zahlen in Go: 5 Fallstricke und ihre Lösungen

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

„Convert string to integer type in Go?“ – eine Frage, die Anfänger quält

\n\n

Jeder, der angefangen hat, in Go zu programmieren, ist früher oder später gegen eine Wand gelaufen: Man muss einen String wie "42" nehmen und ihn in eine ehrliche Zahl 42 verwandeln. Es scheint so einfach, oder? Aber genau diese Frage sammelt auf Stack Overflow tausende Aufrufe und darunter Dutzende Kommentare mit typischen Fehlern. Warum passiert das?

\n\n

In Go gibt es nicht das aus Python oder JavaScript gewohnte int("42"). Stattdessen gibt es das mächtige, aber strenge Paket strconv, das einen dazu zwingt, darüber nachzudenken, was schiefgehen könnte. Und das ist richtig: Man kann nicht einfach einen String in int „werfen“, weil der String kaputt, leer oder voller überflüssiger Leerzeichen sein könnte.

\n\n

In diesem Artikel analysieren wir die Konvertierung von Strings in Zahlen in Go anhand realer Beispiele, gehen auf die Fallstricke ein, über die selbst erfahrene Entwickler stolpern, und geben funktionierende Code-Vorlagen. Los geht‘s!

\n\n

1. Das Hauptwerkzeug: Das Paket strconv

\n\n

In der Standardbibliothek von Go ist das Paket strconv für die Umwandlung von Strings zuständig. Es hat drei Hauptfunktionen, um einen String in eine ganze Zahl umzuwandeln:

\n\n
    \n
  • Atoi(s string) (int, error) – die einfachste Variante, wandelt einen String in int um (die Bitanzahl hängt von der Plattform ab: 32 oder 64 Bit).
  • \n
  • ParseInt(s string, base int, bitSize int) (int64, error) – bietet volle Kontrolle: Zahlenbasis (10, 16, 2) und Bitanzahl (0, 8, 16, 32, 64).
  • \n
  • ParseUint(s string, base int, bitSize int) (uint64, error) – das Gleiche, aber für vorzeichenlose Zahlen.
  • \n
\n\n

Der häufigste Fehler ist das Ignorieren des zurückgegebenen Fehlers. Schauen wir uns an, wozu das führt.

\n\n

Beispiel 1: Fehler ignorieren – Bug erhalten

\n\n
package main\n\nimport (\n    "fmt"\n    "strconv"\n)\n\nfunc main() {\n    s := "123abc"\n    num, _ := strconv.Atoi(s) // Fehler geschluckt!\n    fmt.Println(num)          // Ausgabe: 0 – und Sie erfahren nicht einmal, dass etwas schiefgelaufen ist\n}\n
\n\n

In Go gibt es keine Ausnahmen, ein Fehler ist ein Wert. Wenn Sie ihn ignorieren (_), erhalten Sie den Nullwert (0) und verbringen Stunden mit Debuggen, um herauszufinden, warum Ihr Programm sich seltsam verhält. Behandeln Sie den Fehler immer!

\n\n

2. Top-5-Fehler bei der Konvertierung von string in int in Golang

\n\n

Wir haben die Fragen auf Stack Overflow analysiert und die häufigsten Probleme identifiziert. Hier sind sie:

\n\n

Fehler Nr. 1: Leerzeichen und unsichtbare Zeichen

\n\n

Der String " 42 " oder "42\\n" – Atoi gibt einen Fehler zurück. Go toleriert keine überflüssigen Zeichen, anders als einige Sprachen, die den String automatisch trimmen.

\n\n
s := " 42 "\nnum, err := strconv.Atoi(s)\nif err != nil {\n    fmt.Println("Fehler:", err) // strconv.Atoi: parsing " 42 ": invalid syntax\n}\n
\n\n

Lösung: Verwenden Sie strings.TrimSpace() vor der Konvertierung.

\n\n
import "strings"\n\ns := " 42 "\ns = strings.TrimSpace(s)\nnum, err := strconv.Atoi(s)\nif err == nil {\n    fmt.Println(num) // 42\n}\n
\n\n

Fehler Nr. 2: Leerer String

\n\n

Ein leerer String "" ist ebenfalls ein Fehler. Viele Anfänger erwarten, dass ein leerer String in 0 umgewandelt wird, aber das ist nicht der Fall.

\n\n
num, err := strconv.Atoi("")\n// err: strconv.Atoi: parsing "": invalid syntax\n
\n\n

Lösung: Überprüfen Sie die Länge des Strings oder behandeln Sie den Fehler explizit, indem Sie einen Standardwert einsetzen.

\n\n

Fehler Nr. 3: Überlauf (overflow)

\n\n

Wenn der String eine Zahl enthält, die nicht in den gewählten Typ passt, geben Atoi oder ParseInt den Fehler ErrRange und den maximalen/minimalen Wert für diesen Typ zurück.

\n\n
s := "99999999999999999999" // größer als int64\nnum, err := strconv.ParseInt(s, 10, 64)\nif er                

Blogs

Buchempfehlungen