所以最近我遇到了Golang标志的问题,好奇地想知道这是否如预期的那样,是否有问题,或者我是个傻子,对此有一个非常简单的答案。
因此,使用以下代码:
func main() {
test := flag.String("-test", "", "test var")
flag.Parse()
if *test != "" {
fmt.Println(*test)
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令运行它 ./main -test 1
您收到以下自动生成的错误:
flag provided but not defined: -test
Usage of ./main:
--test string
test var
Run Code Online (Sandbox Code Playgroud)
如果再使用./main --test 1,也会发生相同的错误。我发现的唯一方法是将标志定义更改为 test := flag.String("test", "", "test var"),然后使用运行./main -test 1。
所以我的问题是,为什么不能在标志中使用双连字符?如果可以的话,我在哪里出错了?
您可以使用双连字符,这是在包记录在这里:
可以使用一个或两个减号。它们是等效的。
声明了标志后,flag.Parse()将尝试从传递的标志中删除一个或两个连字符,并使用每个标志的其余字符来检测是否已声明一个。这是通过中的标志包在内部完成的parseOne()。
声明带有名称的标记-test将按原样映射它,从而导致在flag.Parse()内部查找名称,test而不是-test实际声明的名称,从而导致您看到错误。
而是在声明一个时仅使用标志的名称:
test := flag.String("test", "", "test var")
Run Code Online (Sandbox Code Playgroud)
并且您可以将此标志与一个(./main -test 1)或两个连字符(./main --test 2)一起使用。