如何在Golang中使用flag package指定位置参数?

mftmpeh8  于 2023-11-14  发布在  Go
关注(0)|答案(3)|浏览(127)

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

wc filename.txt

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

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


但是我不想要一个默认值,我希望程序在没有指定参数的情况下退出并返回一个错误码。我如何向Go语言的二进制文件中添加一个必需的参数?
我还希望能够解析带有类型信息的参数,所以直接检查Args()并不能完全做到这一点。

zf9nrax1

zf9nrax11#

你只需要检查flag.NArg()
来自https://golang.org/pkg/flag/#NArg:
NArg是处理标志后剩余的参数数。

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

字符串

ikfrs5lh

ikfrs5lh2#

您还可以使用flag.narg()函数来确保您拥有所需数量的位置参数,尽管我不知道它在len(flag.args())上提供了什么

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

字符串

dauxcl2d

dauxcl2d3#

如果任何人对标准flag包的行为不满意,即在看到第一个位置参数时立即停止解析,您可以使用这些小型库函数来解析标志,标志可以在位置参数之前或之后。

// ParseFlags works like flag.Parse(), except positional
// args and flag args can be specified in any order.
func ParseFlags() error {
    return ParseFlagSet(flag.CommandLine, os.Args[1:])
}

// ParseFlagSet works like flagset.Parse(), except positional
// args and flag args can be specified in any order.
func ParseFlagSet(flagset *flag.FlagSet, args []string) error {
    var positionalArgs []string
    for {
        if err := flagset.Parse(args); err != nil {
            return err
        }
        // Consume all the flags that were parsed as flags.
        args = args[len(args)-flagset.NArg():]
        if len(args) == 0 {
            break
        }
        // There's at least one flag remaining and it must be a positional arg since
        // we consumed all args that were parsed as flags. Consume just the first
        // one, and retry parsing, since subsequent args may be flags.
        positionalArgs = append(positionalArgs, args[0])
        args = args[1:]
    }
    // Parse just the positional args so that flagset.Args()/flagset.NArgs()
    // return the expected value.
    // Note: This should never return an error.
    return flagset.Parse(positionalArgs)
}

字符串

相关问题