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

标签 go command-line-arguments

我想像这样运行我的程序:

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

最佳答案

os.Args 并不真正了解 flag 包并包含所有命令行参数。试试 flag.Args() (当然是在调用 flag.Parse() 之后)。

关于Golang Flag 被解释为第一个 os.Args 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19617229/

相关文章:

c - 如果我声明一个参数表为空的函数,然后将参数传递给它会怎样?

mysql - 从命令行下载 MySQL 转储

google-app-engine - Gorilla session 从 session golang 中提取结构值

xml - 解析动态 XML

mongodb - 使用 gopkg.in/mgo.v2 作为字符串在 golang 中自定义 mongodb 命令

go - 探查器不显示函数调用(/pgk/profile with pprof)

go - 错误处理匿名函数的最佳实践

java - 从 spring-boot :run 获取命令行参数

ctype.h isdigit 不适用于 argv

javascript - 如何访问 CLI 参数的多个值