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.
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")
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)
}
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.
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)
}
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
Der praktische Soforteinstieg für Developer und Softwarearchitekten, die direkt mit Go produktiv werden wollen.
zur Buchseite beim Rheinwerk Verlag Rheinwerk Computing, ISBN 978-3-8362-7559-0 (als PDF, EPUB, MOBI und Papier)
Source Fellows GmbH
Lerchenstraße 31
72762 Reutlingen
Telefon: (0049) 07121 6969 802
E-Mail: info@source-fellows.com