我正在使用go-flags来解析命令行选项.
根据go-flags文档:"... [if] -h或--help在命令行参数中指定,将自动打印一条帮助消息.此外,返回特殊错误类型ErrHelp."
我打电话的方法是:
func (p *Parser) Parse() ([]string, error) {
Run Code Online (Sandbox Code Playgroud)
我打电话给:
var opts struct {
// ...
}
func main() {
parser := flags.NewParser(&opts, flags.Default)
args, err := parser.Parse()
Run Code Online (Sandbox Code Playgroud)
定义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,
}
}
Run Code Online (Sandbox Code Playgroud)
所以他们有这种自定义的"错误"类型.在上面的Parse()方法中,在内部,错误是通过如下代码块创建的:
help.ShowHelp = func() error {
var b bytes.Buffer
p.WriteHelp(&b)
return newError(ErrHelp, b.String())
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,newError()返回"*Error"作为其类型.但上面的匿名函数返回类型"错误" - 所以这些类型必须兼容.(?)
但现在回到原来的问题 - 我只是想看看我的"错误"是否是"错误"并且成员"类型"等于ErrHelp.所以我试试这个:
if err != nil && flags.Error(err).Type == flags.ErrHelp {
Run Code Online (Sandbox Code Playgroud)
或者就是这样:
fmt.Printf("test:", flags.Error(err))
Run Code Online (Sandbox Code Playgroud)
无论哪种方式编译器给我:
main.go:37:无法将err(类型错误)转换为flags.Error类型
但是没有说明为什么不能进行转换.有任何想法吗?
(我不知道"*Error"如何在上面的匿名函数中成功转换为"错误",我甚至更不明白为什么如果有效,那么我无法将其转换回来...我我必须遗漏一些真正愚蠢的东西,但我不知道它是什么.)
Pau*_*kin 12
An error是具有单个方法的接口Error() string.请参阅http://golang.org/pkg/builtin/#error
A flags.Error有这样的方法,所以它可以用作error.
但是,相反,a flags.Error是一个结构体,并且无法将任意值转换为结构体.
你可以做的是,我认为这是你的问题的答案,如果你有一个flags.Value内部error,那么你可以error回到基础类型.语法是e := err.(*flags.Error).这将给你一个类型的值*flags.Error(或恐慌,如果基础类型不是*flags.Error).在这种情况下,您可以使用逗号表单来避免恐慌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.
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11608 次 |
| 最近记录: |