我在Go中启动SSH客户端连接,并且在尝试返回错误时尝试访问详细的错误数据。
我目前正在使用此代码:
client, err := ssh.Dial("tcp", "unknownserver:22", config)
if err != nil {
if oerr, ok := err.(*net.OpError); ok {
a := oerr.Err
fmt.Printf("%#v\n", a)
}
log.Fatal("Failed to dial: " + err.Error())
}
返回这两行错误数据:
&net.DNSError{Err:"no such host", Name:"unknownserver", Server:"", IsTimeout:false, IsTemporary:false}
2016/06/23 11:59:00 Failed to dial: dial tcp: lookup unknownserver: no such host
我正在尝试使用以下内容打印net.DNSError内Name
字段的内容:
fmt.Println(a.Name)
然而,当尝试编译代码时,我收到此错误:
a.Name undefined (type error has no field or method Name)
如果oerr
是net.OpError类型的结构,而oerr.Err
是 net.DNSError 类型的结构且字段为{Err:"no such host", Name:"unknownserver", Server:"", IsTimeout:false, IsTemporary:false}
,则为有可能访问struct的字段吗?或者我在这里误解了一个关键概念?
谢谢,
-Martin
答案 0 :(得分:0)
使用第二种类型的断言条件:
client, err := ssh.Dial("tcp", "unknownserver:22", config)
if err != nil {
if oerr, ok := err.(*net.OpError); ok {
a := oerr.Err
if d, ok := a.(*net.DNSError); ok {
fmt.Println(d.Name)
}
fmt.Printf("%#v\n", a)
}
log.Fatal("Failed to dial: " + err.Error())
}
第一个类型断言将oerr
设置为*net.OpError
,但该结构的Err
字段的类型为error
,这是一个内置接口类型(所以它没有字段)。要访问该错误的字段,首先必须声明它是一个结构(特别是您想要的*net.DNSError
结构),然后您可以访问该结构的(导出)字段。