2013-10-27 7 views
10

Ich mag würde mein Programm wie folgt auszuführen:Golang Flag wird als erste os.Args Argument interpretiert

go run launch.go http://example.com --m=2 --strat=par 

http://example.com“ als erstes Befehlszeilenargument interpretiert wird, was in Ordnung ist, aber die Fahnen sind nicht danach analysiert und auf dem Standardwert bleiben. Wenn ich es so:

go run launch.go --m=2 --strat=par http://example.com 

dann „-M = 2“ wird als erstes Argument interpretiert (die die URL sein sollte).

Ich könnte auch nur die os.Args vollständig entfernen, aber dann hätte ich nur optionale Flags und ich möchte eine (die URL) obligatorisch sein.

Hier ist mein Code:

package main 

import (
    "fmt" 
    "webcrawler/crawler" 
    "webcrawler/model" 
    "webcrawler/urlutils" 
    "os" 
    "flag" 
) 

func main() { 
    if len(os.Args) < 2 { 
     log.Fatal("Url must be provided as first argument") 
    } 

    strategy := flag.String("strat", "par", "par for parallel OR seq for sequential crawling strategy") 
    routineMultiplier := flag.Int("m", 1, "Goroutine multiplier. Default 1x logical CPUs. Only works in parallel strategy") 

    page := model.NewBasePage(os.Args[1]) 
    urlutils.BASE_URL = os.Args[1] 
    flag.Parse() 
    pages := crawler.Crawl(&page, *strategy, *routineMultiplier) 
    fmt.Printf("Crawled: %d\n", len(pages)) 
} 

ich mir ziemlich sicher bin, dass dies möglich sein sollte, aber ich kann nicht herausfinden, wie.

EDIT: Danke Justinas für den Hinweis mit der Flagge.Args(). Ich passte es jetzt so und es funktioniert:

... 
flag.Parse() 

args := flag.Args() 
    if len(args) != 1 { 
     log.Fatal("Only one argument (URL) allowed.") 
    } 

page := model.NewBasePage(args[0]) 
... 

Antwort

20

os.Args nicht wirklich etwas über das flag Paket weiß und enthält alle Befehlszeilenargumente. Versuchen Sie flag.Args() (nach dem Aufruf flag.Parse(), natürlich).

+3

Scheint nicht mit meinem Programm zu arbeiten. Wenn vor einem Flag ein Argument steht, liest es das Flag einfach nicht, unabhängig davon, ob Sie 'flag.Args()' und 'flag.Parse()' verwenden. – mmstick

11

Als Followup, zu analysieren Flags, die einen Befehl wie

runme init -m thisis 

Sie folgen können Ihre eigenen flagset erstellen den ersten Wert wie

var myValue string 
mySet := flag.NewFlagSet("",flag.ExitOnError) 
mySet.StringVar(&myValue,"m","mmmmm","something") 
mySet.Parse(os.Args[2:]) 
0

Sie können prüfen, überspringen, wenn die Arg beginnt mit "-" oder "-" und vermeiden Sie die Verwendung dieses Arg in einer Schleife.

Zum Beispiel:

for _, file := range os.Args[1:] { 
    if strings.HasPrefix(file, "--") { 
     continue 
    } 
    //do stuff 
    } 
Verwandte Themen