【问题标题】:Ignore flag case忽略标志大小写
【发布时间】:2018-06-20 19:17:34
【问题描述】:

是否有忽略 Go 标志的大小写(不区分大小写)?

我想让我的程序尽可能宽容和用户友好。

 dbType := flags.String( "dbType", "", "The `dbType` to deploy. )

如果用户输入以下任何内容,我希望初始化此标志的值:

 -dbtype
 -dbType
 -DBTYPE

不幸的是,对于这个项目,我仅限于使用 flag 库。

【问题讨论】:

  • 标准库flag包区分大小写。
  • @Adrian:既然是这样(我真的不打算将其作为双关语),我认为大多数 Go 程序都有区分大小写的标志名称,大多数用于在类 Unix 系统下使用。我会质疑违反该约定的用户友好性。 (我想知道 Windows 程序的约定,但我没有足够的兴趣做任何研究。)
  • 典型的经典windows命令行不区分大小写,但习惯上是大写的。标志是单字符的,用正斜杠而不是破折号表示。现代 powershell 脚本使用更多类似 unix 的标志,但仍然不区分大小写。

标签: go


【解决方案1】:

Go 标志是区分大小写的,所以默认情况下你不能做你想做的事。 但是你可以设置你允许用户输入的值,让它们指向同一个变量,即:

const dbTypeUsage = "The `dbType` to deploy."

var dbType string
flag.StringVar(&dbType, "dbType", "", dbTypeUsage)
flag.StringVar(&dbType, "DBTYPE", "", dbTypeUsage)
flag.StringVar(&dbType, "DBType", "", dbTypeUsage)
flag.StringVar(&dbType, "dbtype", "", dbTypeUsage)
...

【讨论】:

    【解决方案2】:

    用小写定义你的标志

    dbType := flags.String( "dbtype", "", "The `dbType` to deploy. )
    

    然后只制作你的标志 strings.ToLower() (假设你的标志是第二个参数):

    args[1] = strings.ToLower(args[1])
    err := flagSet.Parse(args[1:])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2014-02-08
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多