为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以从 Go 'net' 包中访问嵌入在“OpError”结构中的“DNSError”

是否可以从 Go 'net' 包中访问嵌入在“OpError”结构中的“DNSError”

Go
aluckdog 2022-01-17 20:16:32
我正在 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您想要的结构),然后您可以访问该结构的(导出的)字段。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信