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

我正在 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},是否可以访问该结构的字段?还是我在这里误解了一个关键概念?


aluckdog
浏览 144回答 1
1回答

精慕HU

使用第二种有条件的断言: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您想要的结构),然后您可以访问该结构的(导出的)字段。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go