是否可以不在Go的标志包中设置默认值?例如,在flag package中,您可以写出以下行:

filename := flag.String("file", "test.csv", "Filename to cope with")

在上面的代码中,我不一定要设置默认值(在本例中是test.csv),而是总是让用户指定他们自己的文件名,如果没有指定,那么我想导致错误并退出程序.

我想到的一个方法是,在执行flag.Parse()之后,我首先判断filename的值,如果该值是test.csv,那么程序将退出,并显示相应的错误消息.然而,如果可以避免的话,我不想编写这样的冗余代码——即使不能,我也希望听到更好的方法来处理这个问题.

顺便说一下,您可以在Pythonargparse模块中执行这些操作--如果可以的话,我只想实现类似的操作……

另外,我是否可以同时实现短参数和长参数(换句话说,同时实现-f-file参数?)在旗帜包裹里吗?

谢谢.

推荐答案

我认为用这样一种方式来设计你的标志值是惯用的,当它等于它们各自类型的零值时,意味着"不存在".例如:

optFile := flag.String("file", "", "Source file")
flag.Parse()
fn := *optFile
if fn == "" {
        fn = "/dev/stdin"
}
f, err := os.Open(fn)
...

第二个问题:IINM,旗帜包by design没有区分-flag--flag.也就是说,您的标志集可以同时包含-f--file,并且可以在ffile之前写入任何版本的---.然而,考虑到另一个定义的标志-g,标志包not将识别-gf foo等于-g -f foo.

Go相关问答推荐

在保留额外参数的同时解封YAML

即使HTTP服务器正在使用GO和Protobuf、SQL Server启动,请求也不返回结果

日志(log)文件不在 golang 的日志(log)目录中

切片的下限和上限

如何在golang中使用viper获取对象的配置数组?

AWS Lambda 中的 Websocket URL 超时达到错误

加载 docker 镜像失败

自定义 Fyne 自适应网格布局

判断不同 go map 类型中的重复键

emersion/go-imap - imap.FetchRFC822:无效内存地址或零指针取消引用

将 .gz 文件添加到 tar.gz 文件,但在添加之前解码 gz.输出文件被剪辑(损坏)

使用 Golang 在字符串中循环重复数据

如何根据 Go 中第二次出现的分隔符拆分字符串?

go:embed 文件扩展名模式

为什么 Go 被认为是部分抢占式的?

从golang中的url加载图像

curl:(56)Recv失败:连接由golang中的对等方与docker重置

为什么 template.ParseFiles() 没有检测到这个错误?

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error

带有 *s3.S3 对象的 Golang 单元测试