为了账号安全,请及时绑定邮箱和手机立即绑定

golang 类型转换未按 (I) 预期工作

golang 类型转换未按 (I) 预期工作

Go
回首忆惘然 2021-06-17 18:01:51
我正在使用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 uintconst (    // 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”作为它的类型。但是上面的匿名函数返回类型“错误” - 所以这些类型必须兼容。(?)但现在回到最初的问题——我只是想看看我的“err”是否是一个“错误”并且成员“Type”是否等于 ErrHelp。所以我试试这个:if err != nil && flags.Error(err).Type == flags.ErrHelp {或者甚至只是这个:fmt.Printf("test:", flags.Error(err))无论哪种方式,编译器都会给我:main.go:37: 无法将 err(类型错误)转换为类型 flags.Error但没有说明为什么不能完成这种转换。有任何想法吗?(我不明白在上面的匿名函数中“*Error”是如何成功转换为“error”的,而且我更不明白为什么如果它有效然后我不能以其他方式将它转换回来......这里一定漏掉了一些非常愚蠢的东西,但我没有看到它是什么。)
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信