加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

类型 – golang类型转换不起作用(I)预期

发布时间:2020-12-16 09:27:39 所属栏目:大数据 来源:网络整理
导读:我正在使用 go-flags来解析命令行选项. 根据go-flags文档:“… [if] -h或–help在命令行参数中指定,将自动打印一条帮助消息.此外,返回特殊错误类型ErrHelp.” 我打电话的方法是: func (p *Parser) Parse() ([]string,error) { 我打电话给: var opts struc
我正在使用 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: cannot convert err (type error) to type flags.Error

但是没有说明为什么不能进行转换.有任何想法吗?

(我不知道“* Error”如何在上面的匿名函数中成功转换为“错误”,我甚至更不明白为什么如果有效,那么我无法将其转换回来…我我必须遗漏一些真正愚蠢的东西,但我不知道它是什么.)

解决方法

错误是具有单个方法Error()字符串的接口.见 http://golang.org/pkg/builtin/#error

flags.Error有这样的方法,所以它可以用作错误.

但是,相反,flags.Error是一个结构,并且无法将任意值转换为结构.

你可以做的是,我认为这是你的问题的答案,如果你有一个标志.错误内的值,那么你可以将错误转回基础类型.其语法是e:= err.(* flags.Error).这将为您提供类型* flags.Error的值(如果底层类型不是* flags.Error,则为panic).在这种情况下,您可以使用逗号表单来避免恐慌,即:e,ok:= err.(* flags.Error).

具体来说,你会写:

args,err := flags.Parse()
  if err != nil {
     if ferr,ok := err.(*flags.Error); ok {
       // ... something using ferr
     } else {
       // ... deal with non-flags.Error case,if that's possible.
     }
  }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读