我想像这样运行我的程序:
go run launch.go http://example.com --m=2 --strat=par
“ http://example.com ” 被解释为第一个命令行参数,这没问题,但之后不解析标志并保持默认值。如果我这样说:
go run launch.go --m=2 --strat=par http://example.com
然后 "--m=2" 被解释为第一个参数(应该是 URL)。
我也可以完全删除 os.Args,但是我将只有可选标志,并且我希望一个(URL)是强制性的。
这是我的代码:
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))
}
我很确定这应该是可能的,但我不知道如何。
编辑:感谢 justinas 提供 flag.Args() 的提示。我现在像这样对其进行了调整,并且可以正常工作:
...
flag.Parse()
args := flag.Args()
if len(args) != 1 {
log.Fatal("Only one argument (URL) allowed.")
}
page := model.NewBasePage(args[0])
...