【问题标题】:Casting pflags.Flag.Value as Arbitrary Types将 pflags.Flag.Value 转换为任意类型
【发布时间】:2023-03-17 15:55:02
【问题描述】:

我正在使用 github.com/spf13/cobra 解析命令行标志,我所做的几乎所有事情都运行良好,但我无法弄清楚如何在运行时从 *cobra.Command 中获取特定类型的值.

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 可以将这些 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

【问题讨论】:

    标签: go command-line-interface cobra pflag-go


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多