go - golang 标志问题

标签 go

最近我遇到了一个关于 Golang 标志的问题,我很想知道这是否是预期的,它是否是一个问题,或者我是不是一个喋喋不休的白痴,对此有一个非常简单的答案。

所以使用下面的代码:

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.

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

最佳答案

您可以使用双连字符,这在包 here 中有记录:

One or two minus signs may be used; they are equivalent.

声明您的标志后,flag.Parse() 将尝试从传递的标志中删除一两个连字符,并使用每个标志的剩余字符来检测是否已声明一个标志。这是由 parseOne() 中的标志包在内部完成的.

声明一个名为 -test 的标志将按原样映射它,导致 flag.Parse() 在内部寻找名称 test 而不是你实际声明的 -test,导致你看到的错误。

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

test := flag.String("test", "", "test var")

您可以将此标志与一个 (./main -test 1) 或两个连字符 (./main --test 2) 一起使用。

关于go - golang 标志问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47540876/

相关文章:

go - 声明函数类型的方法有什么区别?

go - 通过迭代函数 slice 调用每个函数

go - 如何在更改位置时更新导入

go - 如何以编程方式调用 Gurilla Mux 处理程序?

go - 使用反射和循环修改结构体值

vim 去 : Can't get autocompletion

Go 项目的主要 goroutine 永远休眠?

string - 在 Golang 中按长度拆分字符串

go - 选择完成后,这个 FOR 循环如何中断

regex - 使用正向预测 (?=regex) 和 re2