Von der Idee zum CLI-Tool in Go: schreiben, kompilieren, deployen

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

Warum Go die ideale Sprache für CLI-Tools ist?

\n\n

Stellen Sie sich vor: Sie müssen ein Tool schreiben, das in der Konsole läuft, Dateien verarbeitet, APIs abfragt oder einfach Routineaufgaben automatisiert. Sie könnten Python, Node.js oder Bash wählen. Aber wenn Geschwindigkeit, Binärgröße und einfache Verteilung entscheidend sind, ist Ihre Wahl CLI-Tools in Go.

\n\n

Go kompiliert zu einer einzigen statischen Binärdatei. Keine Abhängigkeiten, kein "Haben Sie Python 3.8 installiert?". Herunterladen – ausführen. Das macht Golang CLI-Tools zum De-facto-Standard in der DevOps-Welt (denken Sie an Docker, Kubernetes, Hugo – alle sind in Go geschrieben).

\n\n

In diesem Artikel sprechen wir nicht nur über Theorie. Wir erstellen von Grund auf ein echtes Konsolen-Tool in Go, das JSON parst, mit HTTP arbeitet und schöne Tabellen ausgibt. Sie erfahren, wie Sie ein Projekt strukturieren, Fehler behandeln und für jede Plattform kompilieren.

\n\n

Einrichtung der Umgebung und Projektstruktur

\n\n

Bevor Sie Code schreiben, stellen Sie sicher, dass Go installiert ist (Version 1.21+). Überprüfen können Sie es einfach:

\n\n
go version
\n\n

Erstellen wir ein Verzeichnis für unser Projekt. Nennen wir das Tool json2table – es wird JSON von stdin oder aus einer Datei lesen und die Daten als Tabelle ausgeben.

\n\n
mkdir json2table\ncd json2table\ngo mod init github.com/ihr-benutzername/json2table
\n\n

Die Projektstruktur wird klassisch für die Entwicklung in Go sein:

\n\n
    \n
  • main.go – Einstiegspunkt
  • \n
  • internal/ – interne Logik (Parsen, Ausgabe)
  • \n
  • cmd/ – Code zur Befehlsverarbeitung (falls Cobra verwendet wird)
  • \n
\n\n

Wir beginnen einfach, ohne Frameworks, und fügen später Flags und Hilfe hinzu.

\n\n

Den Kern des Tools schreiben: JSON-Parsing und Tabellenausgabe

\n\n

Erstellen Sie die Datei internal/parser.go. Hier werden wir JSON analysieren und in eine Struktur umwandeln.

\n\n
package internal\n\nimport (\n    "encoding/json"\n    "fmt"\n    "io"\n)\n\n// Record repräsentiert eine Zeile der Tabelle\ntype Record map[string]interface{}\n\n// ParseJSON liest JSON aus einem Reader und gibt einen Slice von Records zurück\nfunc ParseJSON(r io.Reader) ([]Record, error) {\n    var data []Record\n    decoder := json.NewDecoder(r)\n    if err := decoder.Decode(&data); err != nil {\n        return nil, fmt.Errorf("Fehler beim Parsen von JSON: %w", err)\n    }\n    return data, nil\n}
\n\n

Jetzt erstellen wir internal/table.go für die formatierte Ausgabe:

\n\n
package internal\n\nimport (\n    "fmt"\n    "strings"\n    "text/tabwriter"\n    "os"\n)\n\n// PrintTable gibt die Datensätze als formatierte Tabelle aus\nfunc PrintTable(records []Record) {\n    if len(records) == 0 {\n        fmt.Println("Keine Daten zum Anzeigen")\n        return\n    }\n\n    // Sammle alle eindeutigen Schlüssel (Spaltenüberschriften)\n    headers := make([]string, 0)\n    seen := make(map[string]bool)\n    for _, rec := range records {\n        for key := range rec {\n            if !seen[key] {\n                headers = append(headers, key)\n                seen[key] = true\n            }\n        }\n    }\n\n    // Verwende tabwriter für eine schöne Ausgabe\n    w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)\n\n    // Überschrift\n    fmt.Fprintln(w, strings.Join(headers, "\\t"))\n\n    // Trennlinie\n    sep := make([]string, len(headers))\n    for i, h := range headers {\n        sep[i] = strings.Repeat("-", len(h))\n    }\n    fmt.Fprintln(w, strings.Join(sep, "\\t"))\n\n    // Daten\n    for _, rec := range records {\n        row := make([]string, len(headers))\n        for i, h := range headers {\n            if val, ok := rec[h]; ok {\n                row[i] = fmt.Sprintf("%v", val)\n            } else {\n                row[i] = ""\n            }\n        }\n        fmt.Fprintln(w, strings.Join(row, "\\t"))\n    }\n\n    w.Flush()\n}
\n\n

Alles in main zusammenführen.

Blogs

Buchempfehlungen