7

コマンドラインオプションを解析するために go-flagsを使用しています。

go-flags ドキュメントによると:

... [if] -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 に変換できません

しかし、その変換ができない理由については述べていません。何か案は?

(上記の無名関数で「*エラー」が「エラー」に正常に変換される方法がわかりません。さらに、それが機能する場合、逆に変換できない理由もわかりません...私はここには本当にばかげた何かが欠けているに違いありませんが、それが何であるかはわかりません.)

4

1 に答える 1