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])
...
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