所以最近我遇到了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
运行它。
所以我的问题是为什么你不能使用带标志的双连字符?如果可以的话,这样做的时候我哪里出错了?
答案 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!