我正在 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.DNSErrorName中的字段内容: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},是否可以访问该结构的字段?还是我在这里误解了一个关键概念?
1 回答
精慕HU
TA贡献1845条经验 获得超8个赞
使用第二种有条件的断言:
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为 a *net.OpError,但该Err结构的字段是 type error,这是一个内置接口类型(因此它没有字段)。要访问该错误的字段,您首先必须断言它是一个结构(特别是*net.DNSError您想要的结构),然后您可以访问该结构的(导出的)字段。
- 1 回答
- 0 关注
- 143 浏览
添加回答
举报
0/150
提交
取消