我现在有一个非常基本的CLI应用程序,可以与flag
库一起使用。它接受两个标志,并简单地将值打印到终端
$ ./hello --flag1 v1 --flag2 v2
v1
v2
如果说我不小心设置了
flag2
,但是忘记提供该值,它可能会显示一条错误消息$ ./hello --flag1 v1 --flag2
flag needs an argument: -flag2
Usage of ./hello:
-flag1 string
usage1 (default "value1")
-flag2 string
usage3 (default "value2")
但是,如果我设置
flag1
,不为其提供值,然后设置flag2
,则没有错误$ ./hello --flag1 --flag2 v2
--flag2
value2
我觉得
flag1
使用flag2
的名称作为值似乎很奇怪,更不用说flag2
甚至没有获得提供的值。我希望结果是一条错误消息,类似于设置flag2
且未提供任何值。这是图书馆的限制吗?还是这是一个错误?
是否有某种方法可以使其正确解析,还是我必须添加自己的自定义解析逻辑?
复制的最低代码:
package main
import (
"flag"
"fmt"
)
func main() {
flag1 := flag.String("flag1", "value1", "usage1")
flag2 := flag.String("flag2", "value2", "usage3")
flag.Parse()
fmt.Println(*flag1)
fmt.Println(*flag2)
}
最佳答案
如果希望""
为空字符串,则必须使用flag2
对其进行显式设置。
$ ./hello --flag1 v1 --flag2 ""
对于另一个问题,当您指定
flag1
时,后面的所有内容都是字符串值。所以当您使用时听起来并不奇怪$ ./hello --flag1 --flag2
然后,
flag1
的值为“flag2”,因为它与您这样编写时相同:$ ./hello --flag1="--flag2"
顺便说一句,您不必为其指定值的标志的类型是
bool
。仅将标志指定为true
就足够了。
关于go - GO标志无法正确解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62334118/