【问题标题】:How to specify positional arguments with the flag package in Golang?如何在 Golang 中使用 flag 包指定位置参数?
【发布时间】:2017-04-21 13:17:35
【问题描述】:

有时我想在命令行上传递一个没有名称的参数,比如wc 这样的命令,它以文件名作为输入:

wc filename.txt

使用flag package,看起来每个标志都必须有一个名称,如果未指定,则使用默认值。

filename := flag.String("filename", "foo.txt", "Which file to count the words for")

但是我不想要默认值,如果未指定参数,我希望程序以错误代码退出。如何向 Go 二进制文件添加必需的参数?

我还希望能够解析带有类型信息的参数,因此仅直接检查 Args() 并不能完全做到。

【问题讨论】:

    标签: go


    【解决方案1】:

    您只需检查flag.NArg()

    来自https://golang.org/pkg/flag/#NArg

    NArg 是处理完标志后剩余的参数数量。

    flag.Parse()
    if flag.NArg() == 0 { 
        flag.Usage()
        os.Exit(1)
    }
    

    【讨论】:

    • 这是否意味着您不能对位置参数强制类型?
    • Usage 是一个包含函数的变量。你可以在这里找到它。 golang.org/pkg/flag/#pkg-variables
    • 我看不出flag.Usage() 函数如何通过位置参数提供有用的输出,因为我找不到“注册”它们的方法。我在这里对此进行了更多扩展:stackoverflow.com/questions/31873183/…
    • 请注意:这对位置参数与标志的顺序很敏感。例如:outp := flag.String("output", "out.txt", "Output file") Shell: myProgram positional_arg.txt -output redirect.txt # *outp = "out.txt", flag.NArg() = 3
    【解决方案2】:

    你也可以使用 flag.Narg() 函数来确保你有所需数量的位置参数,虽然我不知道它给你带来了什么 len(flag.Args())

    if flag.NArg() < minArgs { 
        // do something
        ...
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 2012-04-09
    • 2011-02-17
    • 2013-11-06
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多