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