类型 – golang类型转换不起作用(I)预期
我正在使用
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)) 无论哪种方式编译器给我:
但是没有说明为什么不能进行转换.有任何想法吗? (我不知道“* 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. } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |