Приведение 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")