go - 将 pflags.Flag.Value 转换为任意类型
问题描述
我github.com/spf13/cobra
用来解析命令行标志,我所做的几乎所有事情都运行良好,但我无法弄清楚如何*cobra.Command
在运行时从 a 中获取特定类型的值。
我的命令定义如下所示cmd/generate.go
:
var (
generateCommand = &cobra.Command{
// ...
}
generateTokenCommand = &cobra.Command{
// ...
Run: func(cmd *cobra.Command, args []string) {
// command body here
}
}
)
func init() {
generateCommand.AddCommand(generateTokenCommand)
// setup generate token flags
flags := generateTokenCommand.Flags()
flags.Uint64P("user-id", "i", 1, "User ID")
flags.BoolP("is-admin", "a", "Is admin.")
// other flags.StringP, but those are easy
}
注意:我知道有用于将这些绑定到静态变量的 API,如果可能的话,我会尽量避免这样做,以将内容包含在 Cobra 中。
在内部generateTokenCommand.Run
,例如我的入口点,我无法从cobra.Command
.
当我需要获取字符串值时,我可以简单地:
var email string = cmd.Flag("email").Value.String()
pflags.Flag
有一个名为 的字段Value
,其类型为pflags.Value
,如下所示:
// Value is the interface to the dynamic value stored in a flag.
// (The default value is represented as a string.)
type Value interface {
String() string
Set(string) error
Type() string
}
如果我进入调试器并像这样获取值:
userIdValue := cmd.Flag("user-id").Value
我看到 this 的运行时类型是*github.com/spf13/pflag.uint64Value
,但由于这是私有类型,我似乎无法转换该值:
// does not compile
cmd.Flag("user-id").Value.(uint64)
我怎样才能转换或使用其他方法来解决这个Value
问题uint64
?
解决方案
我可能在深入研究后找到了答案,有一种方法pflags.FlagSet
叫做GetUint64
:
// GetUint64 return the uint64 value of a flag with the given name
func (f *FlagSet) GetUint64(name string) (uint64, error) {
val, err := f.getFlagType(name, "uint64", uint64Conv)
if err != nil {
return 0, err
}
return val.(uint64), nil
}
我认为我的问题已经习惯了文档和 Golang 源代码的组织方式,但这确实有效:
uid, err := cmd.Flags().GetUint64("user-id")
推荐阅读
- c++ - 使用 GLM 库在 OpenGL 中绘制顶点时如何使用常规坐标系
- javascript - React,调用一个无状态函数来组织代码,但是这个怎么绑定呢?
- react-native - 将 react-native 应用程序发布到 expo.io 时出现“ResourceNotFoundError”
- java - 更改 JButton 焦点框的颜色
- python - 如何使用 date2num?
- python - 在对数图上显示更多刻度标签
- python - Django:获取所有对象并将其返回以查看
- haskell - 可以为类型提供文字的构造函数的数据类型提升
- python - PI 会议地点中的 Google Calendar Python API
- bash - 匹配前对每行中的所有字符进行grep