首页 > 解决方案 > 将 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

标签: gocommand-line-interfacecobrapflag-go

解决方案


我可能在深入研究后找到了答案,有一种方法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")

推荐阅读