go - GO标志无法正确解析

标签 go

我现在有一个非常基本的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/

相关文章:

go - 使用 rows.NextResultSet() 在多结果集查询中调用 rows.Err()

algorithm - 在 Go 中查找配对排列

mongodb - 如何在 Go 中保持客户端与 MongoDB 的连接?

arrays - 为什么在 Go 中调用可变参数函数时不能_直接_使用数组?

go - GO 应用程序在管道中时如何提示用户输入

go - 使用 bytes.Buffer 与使用 *bytes.NewBuffer 时 json.Unmarshal 的区别

performance - 简单的 golang http rest 服务在负载下挂起

mysql - 如何确定数据库服务器或嵌入式数据库是否合适

go - println 和 fmt.Println 的竞争检测器输出不同

go - 如何验证无效的unicode代码点值?