为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 标志被解释为第一个 os.Args 参数

Golang 标志被解释为第一个 os.Args 参数

Go
慕标琳琳 2021-06-30 05:09:51
我想像这样运行我的程序: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 mainimport (    "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])...
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

os.Argsflag软件包一无所知,并且包含所有命令行参数。尝试flag.Args()flag.Parse()当然是在调用之后)。


查看完整回答
反对 回复 2021-07-05
?
弑天下

TA贡献1818条经验 获得超8个赞

这也让我绊倒了,因为我flag.String/flag.Int64/etc在我的应用程序中调用了几个地方,我不想到处传递一个新flag.FlagSet的。


// If a commandline app works like this: ./app subcommand -flag -flag2

// `flag.Parse` won't parse anything after `subcommand`.

// To still be able to use `flag.String/flag.Int64` etc without creating

// a new `flag.FlagSet`, we need this hack to find the first arg that has a dash

// so we know when to start parsing

firstArgWithDash := 1

for i := 1; i < len(os.Args); i++ {

    firstArgWithDash = i


    if len(os.Args[i]) > 0 && os.Args[i][0] == '-' {

        break

    }

}


flag.CommandLine.Parse(os.Args[firstArgWithDash:])

我这样做的原因是因为无论如何flag.Parse只是flag.CommandLine.Parse(os.Args[1:])在幕后打电话。


查看完整回答
反对 回复 2021-07-05
  • 3 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信