将 pflags.Flag.Value 转换为任意类型

问题描述 投票:0回答:1

我正在使用

github.com/spf13/cobra
来解析命令行标志,我所做的一切都运行良好,但我无法弄清楚如何在运行时从
*cobra.Command
中获取特定类型的值。

我的命令定义如下所示:

cmd/generate.go

注意:我知道有一些 API 可将它们绑定到静态变量,如果可能的话,我会尽量避免这样做,以将内容保留在 Cobra 中。

内部
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 }

,例如我的入口点,我无法从

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

,但由于这是一个私有类型,我似乎无法转换该值:
*github.com/spf13/pflag.uint64Value

我如何投射或使用其他方法来解决这个
// does not compile cmd.Flag("user-id").Value.(uint64)

作为

Value
    

go command-line-interface go-cobra pflag-go
1个回答
1
投票
uint64

上有一个方法叫做

pflags.FlagSet
GetUint64

我认为我的问题是习惯了文档和 Golang 源代码的组织方式,但这确实有效:

// 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 }

© www.soinside.com 2019 - 2024. All rights reserved.