Я использую go-flags для анализа параметров командной строки.
Согласно документам go-flags: "... [если] в аргументах командной строки был указан либо -h, либо --help, будет автоматически напечатано справочное сообщение. Кроме того, возвращается специальный тип ошибки ErrHelp. "
Метод, который я вызываю:
func (p *Parser) Parse() ([]string, error) {
Я звоню с помощью:
var opts struct {
// ...
}
func main() {
parser := flags.NewParser(&opts, flags.Default)
args, err := parser.Parse()
Фрагмент из файла, определяющего ErrHelp, выглядит так:
type ErrorType uint
const (
// Unknown or generic error
ErrUnknown ErrorType = iota
// Expected an argument but got none
ErrExpectedArgument
// ...
// The error contains the builtin help message
ErrHelp
// ...
)
// Error represents a parser error. The error returned from Parse is of this
// type. The error contains both a Type and Message.
type Error struct {
// The type of error
Type ErrorType
// The error message
Message string
}
// Get the errors error message.
func (e *Error) Error() string {
return e.Message
}
func newError(tp ErrorType, message string) *Error {
return &Error{
Type: tp,
Message: message,
}
}
Итак, у них есть этот пользовательский тип «Ошибка». И в приведенном выше методе Parse() внутри создается ошибка с блоком кода, подобным этому:
help.ShowHelp = func() error {
var b bytes.Buffer
p.WriteHelp(&b)
return newError(ErrHelp, b.String())
}
Как видите, newError() возвращает "*Error" в качестве типа. Но анонимная функция выше возвращает тип «ошибка», поэтому эти типы должны быть совместимы. (?)
Но теперь вернемся к исходной проблеме - я просто пытаюсь выяснить, является ли моя "ошибка" "ошибкой" и имеет ли член "Тип", равный ErrHelp. Поэтому я пробую это:
if err != nil && flags.Error(err).Type == flags.ErrHelp {
Или даже просто это:
fmt.Printf("test:", flags.Error(err))
И в любом случае компилятор дает мне:
main.go:37: невозможно преобразовать err (ошибка типа) в тип flags.Error
Но не указывает, почему это преобразование не может быть выполнено. Любые идеи?
(Я не понимаю, как "*Error" успешно преобразуется в "error" в анонимной функции выше, и я еще больше не понимаю, почему, если это работает, я не могу преобразовать его обратно... Я Должно быть, здесь не хватает чего-то действительно глупого, но я не вижу, что это такое.)