2013-10-27 8 views
10

Vorrei eseguire il mio programma come questo:Golang Flag viene interpretato come argomento primi os.Args

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

"http://example.com" viene interpretato come il primo argomento da riga di comando, che è ok, ma le bandiere sono non analizzato dopo e rimanere al valore predefinito. Se ho messo in questo modo:

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

poi "--M = 2" viene interpretato come il primo argomento (che dovrebbe essere l'URL).

Potrei anche solo rimuovere os.Args completamente, ma poi avrei solo bandiere opzionali e voglio che uno (l'URL) sia obbligatorio.

Ecco il mio codice:

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)) 
} 

Sono abbastanza sicuro che questo dovrebbe essere possibile, ma io non riesco a capire come.

MODIFICA: Grazie justinas per il suggerimento con il flag.Args(). Io ora adattato come questo e funziona:

... 
flag.Parse() 

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

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

risposta

20

os.Args realtà non sa nulla circa il pacchetto flag e contiene tutti gli argomenti della riga di comando. Prova flag.Args() (dopo aver chiamato flag.Parse(), ovviamente).

+3

non sembra lavorare con il mio programma. Se c'è un argomento davanti a un flag, semplicemente non leggerà il flag, indipendentemente dal fatto che si usi 'flag.Args()' e 'flag.Parse()'. – mmstick

11

Come un follow-up, per analizzare le bandiere che seguono un comando come

runme init -m thisis 

È possibile creare il proprio flagset di saltare il primo valore come

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

È possibile controllare se l'Arg inizia con "-" o "-" ed evitare di usare quell'arg in un ciclo.

Ad esempio:

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