Приведение pflags.Flag.Value как произвольных типов

Я использую 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-интерфейсы для привязки их к статическим переменным. Я стараюсь этого не делать, если это вообще возможно, чтобы сохранить содержимое в Cobra.

Внутри generateTokenCommand.Run, например, моя точка входа, у меня проблемы с получением нестроковых значений из cobra.Command.

Когда мне нужно получить строковое значение, я могу просто:

      var email string = cmd.Flag("email").Value.String()

pflags.Flag имеет поле с именем типа 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 как uint64?

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")
Другие вопросы по тегам