golang flags问题

时间:2017-11-28 21:03:10

标签: go

所以最近我遇到了Golang旗帜的问题,并且很想知道这是否符合预期,如果它是一个问题,或者我是一个闷闷不乐的白痴,并且有一个非常简单的答案。 / p>

所以使用以下代码:

func main() {
    test := flag.String("-test", "", "test var")
    flag.Parse()
    if *test != "" {
        fmt.Println(*test)
    }
}

然后使用以下命令./main -test 1

运行它

您收到以下自动生成的错误:

flag provided but not defined: -test
Usage of ./main:
  --test string
        test var

如果您使用./main --test 1,则会出现相同的错误。我找到的唯一方法是将标记定义更改为test := flag.String("test", "", "test var"),然后使用./main -test 1运行它。

所以我的问题是为什么你不能使用带标志的双连字符?如果可以的话,这样做的时候我哪里出错了?

3 个答案:

答案 0 :(得分:4)

您可以使用双连字符,这在包here

中有记录
  

可以使用一个或两个减号;它们是等价的。

声明了你的标志后,access_log: stored_proc: getsomething uses: usedin: some breadcrumb 将尝试从传递的标志中删除一个或两个连字符,并使用每个标志的剩余字符来检测是否已经声明了一个。这是由parseOne()中的标志包在内部完成的。

声明名为flag.Parse()的标记会按字面顺序将其映射,导致-test在内部寻找名称flag.Parse(),而不是test,这是您实际的名称声明,导致你看到的错误。

相反,在声明一个时只使用标志的名称:

-test

并且您可以将此标记与一个(test := flag.String("test", "", "test var") )或两个连字符(./main -test 1)一起使用。

答案 1 :(得分:3)

尝试定义不带1的标志:

-

答案 2 :(得分:0)

对于我们来说,flag软件包可能不是在这里使用的最好的东西。

相反,您可能要尝试使用Google拥有的getopt软件包,该软件包提供了更标准的命令行解析(与flag软件包相比)。

package main

import (
    "fmt"
    "os"
    "github.com/pborman/getopt"
)

func main() {
    optName := getopt.StringLong("name", 'n', "", "Your name")
    optHelp := getopt.BoolLong("test", 0, "test var")
    getopt.Parse()

    if *optHelp {
        getopt.Usage()
        os.Exit(0)
    }

    fmt.Println("Hello " + *optName + "!")
}

$ ./hello --help
Usage: hello [--test] [-n value] [parameters ...]
     --test        test var
 -n, --name=value  Your name

$ ./hello --name Bob
Hello Bob!