2013-11-04 10 views
14

Ich bin mir nicht sicher, ob ich die Gründe für dieses Beispiel zu verstehen (von here genommen), noch was es versucht, über die Go Sprache zu kommunizieren:Flag Befehlszeile Parsen in golang

package main 

import (
    "flag" 
    "fmt" 
) 

func main() { 
    f := flag.NewFlagSet("flag", flag.ExitOnError) 
    f.Bool("bool", false, "this is bool flag") 
    f.Int("int", 0, "this is int flag") 

    visitor := func(a *flag.Flag) { 
     fmt.Println(">", a.Name, "value=", a.Value) 
    } 

    fmt.Println("Visit()") 
    f.Visit(visitor) 
    fmt.Println("VisitAll()") 
    f.VisitAll(visitor) 

    // set flags 
    f.Parse([]string{"-bool", "-int", "100"}) 

    fmt.Println("Visit() after Parse()") 
    f.Visit(visitor) 
    fmt.Println("VisitAll() after Parse()") 
    f.VisitAll(visitor) 
} 

Etwas nach dem Vorbild von der Einrichtung haben sie aber dann einen

hinzufügen, um das benannte Argument würde nützlicher scheinen. Ich bin völlig neu in Go, versuche also nur, mit der Sprache vertraut zu werden.

+2

https://gobyexample.com/command-line-flags ist ein großartiges Beispiel. – elithrar

+0

Sie benötigen ein FlagSet, wenn Sie Argumente übergeben wollen, die im Code des Programms 'f.Parse ([] string {" - bool "," -int "," 100 "})' parsen. Die globale Funktion 'flag.Parse()' akzeptiert kein Argument zum Parsen. Dieses Codebeispiel kann dann in der Tour von go code pad ausgeführt werden, in der Sie keine Befehlszeilenargumente angeben können. – chmike

Antwort

36

Dies ist ein kompliziertes Beispiel für die Verwendung von flag Paket. In der Regel sind Flags folgendermaßen eingerichtet:

package main 

import "flag" 

// note, that variables are pointers 
var strFlag = flag.String("long-string", "", "Description") 
var boolFlag = flag.Bool("bool", false, "Description of flag") 

func init() { 
    // example with short version for long flag 
    flag.StringVar(strFlag, "s", "", "Description") 
} 

func main() { 
    flag.Parse() 
    println(*strFlag, *boolFlag) 
}  
+3

Ja, das ist der bevorzugte Weg. Ein weiterer netter Trick ist, dass Sie das Flag-Modul von * Any * Modul Splitting Modul spezifischen Flags in einer wartungsfreundlicheren Weise verwenden können – fabrizioM

+0

So wird 'init()' immer vor 'main()' und seine Variablen sind zugänglich innerhalb 'main' ? Auch 'strFlag' ist ein Zeiger, und so wird der * verwendet, um den Wert abzurufen? – lollercoaster

+0

@fabrizioM: von jedem Modul? was genau bedeutet das? kommt aus Python-Hintergrund, so scheint, als ob Sie meinen, dass andere Dateien, die wir hier aus meinem Projekt importieren, auch die gleichen Flag-Variablen verwenden könnten? das wäre eine coole Sache. – lollercoaster