Kommandozeilenwerkzeuge mit Go erstellen

Kommandozeilenwerkzeuge mit Go erstellen

Kommandozeilenwerkzeuge müssen meist parametrisiert werden. Dies geschieht oftmals über Parameter, die man direkt an den Aufruf der Anwendung anhängt. Das Einlesen dieser Parameter kann, unter Umständen, komplexer werden. Wenn man z. B. die Vorschläge von POSIX komplett umsetzen möchte.

Go bzw. Golang liefert gleich im Standardumfang das flag Package mit, das einem die Arbeit mit Kommandozeilenparametern deutlich vereinfacht.

Parameter definieren

Zuerst muss das Package flag importiert werden. Dann kann man Parameter definieren. Im folgenden Beispiel wird ein Parameter mit dem Namen flagname definiert. Er ist vom Typ int und wird im Pointer ip gespeichert. Im Rahmen der Definition wird gleich ein Defaultwert 1234 sowie eine Hilfenachricht help message for flagname angegeben.

import "flag"
var ip = flag.Int("flagname", 1234, "help message for flagname")

Für die verschiedenen Datentypen werden verschiedene Methoden angeboten:

  • flag.Int()
  • flag.String()
  • flag.Bool()
  • flag.Duration()
  • flag.Flat64()
  • flag.Unit()

Möchte man den Wert direkt in eine Variable schreiben kann die ensprechende ..Var() Methode genutzt werden. Also z. B. flag.IntVar().

var flagvar int
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")

Eingaben parsen

Wenn alle Parameter definiert sind, lässt sich mit flag.Parse() die gesamte Eingabe parsen. Hier ein komplettes Beispiel:

package main

import (
	"flag"
	"fmt"
)

func main() {

	flagOne := flag.Int("flagOne", 1234, "help message for flagOne")

	var flagTwo int
	flag.IntVar(&flagTwo, "flagTwo", 4321, "help message for flagTwo")

	flag.Parse()

	fmt.Printf("FlagOne: %d\n", *flagOne)
	fmt.Printf("FlagTwo: %d\n", flagTwo)

}

Aufruf der Anwendung

Die Parameter für den Aufruf der kompilierten Anwendung kann man unterschiedlich angeben. Auch ein doppeltes Minus wird angenommen. Boolsche Wert können auch nur über das Flag angegeben werden.

-flagOne
-flagOne=x
-flagOne x  // nur bei Nicht-Boolean Werten

Startet man die oben dargestellte Anwendung wie folgt:

go run *.go -flagOne 12 -flagTwo 21

Ist die Ausgabe:

FlagOne: 12
FlagTwo: 21

Gibt man einen falschen Parameter an meldet sich das flag Package direkt.

> go run *.go -flagOne 12 -flagThree 2
flag provided but not defined: -flagThree
Usage of /tmp/go-build405346793/b001/exe/main:
  -flagOne int
        help message for flagOne (default 1234)
  -flagTwo int
        help message for flagTwo (default 4321)
exit status 2

Ebenso kann man mit -help bzw. --help die Hilfetexte erhalten.

Erforderliche Eingaben

Möchte man zwingend Werte für Parameter erhalten muss man den Wert auswerten und entsprechend darauf reagieren.

textPtr := flag.String("text", "", "Hier sollte ihr Text stehen. (Required)")
flag.Parse()
if *textPtr == "" {
    flag.PrintDefaults()
    os.Exit(1)
}

Mehr?

Das flag Package bietet noch eine Reihe weiteren sinnvoller Möglichkeiten. So können z. B. auch Unterkommandos geparst werden und komplexe Eingabeszenarien abgebildet werden. Hierzu ist die Doku des Package empfohlen.

Das komplette Beispiel kann auch in GitHub gefunden werden.

05.02.2019

 

Kennen Sie schon das Buch zum Thema?

Der praktische Soforteinstieg für Developer und Softwarearchitekten, die direkt mit Go produktiv werden wollen.

  • Von den Sprachgrundlagen bis zur Qualitätssicherung
  • Architekturstil verstehen und direkt anwenden
  • Idiomatic Go, gRPC, Go Cloud Development Kit
  • Cloud-native Anwendungen erstellen
Microservices mit Go Buch

zur Buchseite beim Rheinwerk Verlag Rheinwerk Computing, ISBN 978-3-8362-7559-0 (als PDF, EPUB, MOBI und Papier)

Kontakt

Source Fellows GmbH

Source Fellows GmbH Logo

Lerchenstraße 31

72762 Reutlingen

Telefon: (0049) 07121 6969 802

E-Mail: info@source-fellows.com