使用 Go (golang)、cobra 和 viper 时,StringVar 与 StringVarP 或 String 与 StringP 之间有什么区别?

What is the difference between StringVar vs StringVarP or String vs StringP when using Go (golang), cobra and viper?

我正在维护一些使用 Go (golang) 编写的代码,Viper and Cobra

在一行中,它有:

rootCmd.PersistentFlags().String("cfg", "", "A description")

然后在下一行有

rootCmd.PersistentFlags().StringP("output", "o", ".", "Another description")

在这种情况下,StringStringP 有什么区别?

查看各种教程中的示例用法,似乎有P和非P版本的各种方法,例如StringVarPStringVar

这些版本有什么区别? P的意义是什么?

有什么方法可以判断给定方法是否具有 P 或非 P 对应方法?

搜索引擎倾向于将我带到 cobra 或 viper 教程页面,这些页面使用这些方法而不解释 P 或非 P 对应方法。

我在 pflags 上发现了一些 material,这表明它可能与参数是否具有短(单字母)形式有关。难道是这个?

Post-edit note:收到这个问题的答案后,似乎 spf13/pflag 确实被上述 golang 框架在幕后使用。但是,目前还不清楚在使用 cobra 或 viper 时是否应该查看 pflags 文档。
由于这是一个问答网站,我已经恢复了一个编辑,删除了我在寻找这个答案时输入的许多关键字,因为我觉得其他人寻找相同的信息会以这种方式得到更好的服务。

P 后缀表示除了全名之外还接受单个字母标志名称的函数,如 pflag 文档的 usage 部分所述:

The pflag package also defines some new functions that are not in flag, that give one-letter shorthands for flags. You can use these by appending 'P' to the name of any function that defines a flag.

回答您的个别问题:

  • 有什么区别:P 函数有一个额外的参数:单字母名称。此短标志可与单个 -.
  • 一起使用
  • 哪些方法有 P 对应方法:所有方法,如 pflag reference
  • 中所示

至于为什么这被记录在 pflag 而不是 viper 或 cobra,这是因为两者 viper and cobra 使用 pflag 库。