2013-08-25 8 views
12

Kann der Standardwert im Flag-Paket in Go nicht gesetzt werden? Zum Beispiel im Flag-Paket können Sie die folgende Zeile schreiben:Flag-Paket in Go - muss ich immer den Standardwert setzen?

filename := flag.String("file", "test.csv", "Filename to cope with") 

In dem obigen Code, mag ich nicht unbedingt Standardwert setzen, die test.csv in diesem Fall ist, und stattdessen immer Benutzer machen angeben ihren eigenen Dateinamen, und wenn es nicht angegeben ist, dann möchte ich einen Fehler verursachen und das Programm beenden.

Einer der Art und Weise kam ich mit, dass ich zum ersten Mal den Wert von filename überprüfen, nachdem flag.Parse() tun, und wenn dieser Wert test.csv ist, dann habe ich das Programm beendet mit der entsprechenden Fehlermeldung. Ich möchte jedoch solchen überflüssigen Code nicht schreiben, wenn er entzogen werden kann - und selbst wenn es nicht möglich ist, würde ich gerne einen besseren Weg hören, das Problem hier zu lösen.

Sie können durch die Art und Weise, diese Art von Operationen in Python argparse Modul tun - ich möchte nur die ähnliche Sache implementieren, wenn ich kann ...

Außerdem kann ich kurze und lange Argumente (in anderen implementieren Wörter sowohl -f und -file Argument?) im Flag-Paket?

Danke.

+0

Bitte nur eine Frage pro Frage stellen. – Kissaki

Antwort

16

Ich denke, es ist idiomatisch, Ihre Merkerwerte so zu gestalten, dass "nicht vorhanden" bedeutet, wenn sie gleich dem Nullwert ihrer jeweiligen Typen sind. Zum Beispiel:

optFile := flag.String("file", "", "Source file") 
flag.Parse() 
fn := *optFile 
if fn == "" { 
     fn = "/dev/stdin" 
} 
f, err := os.Open(fn) 
... 

Ad der zweite Frage: IINM, das Flag-Paket nach Design unterscheidet nicht zwischen -flag und --flag. IOW, Sie können sowohl -f als auch --file in Ihrem Flagsatz haben und eine beliebige Version von oder -- vor beiden f und file schreiben. Unter Berücksichtigung eines anderen definierten Flags -g wird das Flag-Paket jedoch nicht als -gf foo als gleichwertig von -g -f foo erkennen.

+0

Ah, ich habe mir keine Möglichkeit ausgedacht, leeren Platz zu benutzen, danke! – Blaszard

+4

Bietet das Paket 'flag' die Möglichkeit, zu prüfen, ob ein Flag gesetzt ist? Ich spreche nicht über Standardwerte oder keine Werte. Ich meine, ob ein Flag in der Befehlszeile vorhanden ist. – Kiril

+1

@Kiril, können Sie die Funktion [Visit] (https://godoc.org/flag#Visit) verwenden. –

5

Wenn ich ein Flag habe, das keinen Standardwert haben kann, verwende ich oft den Wert REQUIRED oder etwas ähnliches. Ich finde das macht die --help einfacher zu lesen.

Warum war es nicht gebacken, ich vermute, es wurde einfach nicht als wichtig genug angesehen. Der Standardwert würde nicht jedem Bedürfnis entsprechen. Das Flag --help ist jedoch ähnlich. es passt nicht zu jedem Bedürfnis, aber es ist die meiste Zeit gut genug.

Das ist nicht zu sagen, die erforderlichen Flaggen sind eine schlechte Idee. Wenn Sie leidenschaftlich genug sind, könnte ein flagutil Paket schön sein. Wickeln Sie die aktuelle flag API, machen Parse geben Sie einen Fehler, der die fehlende Flagge beschreibt und fügen Sie eine RequiredInt und RequiredIntVar usw. Wenn es sich herausstellt, nützlich/beliebt es könnte mit dem offiziellen flag Paket zusammengeführt werden.

+0

Danke für das 'flagutil' Paket. Ich versuche es mal. – Blaszard