是否可以访问“DNS错误”字段?结构嵌入在一个' OpError' Go' net'包?

时间:2016-06-23 16:15:14

标签: go

我在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)

如果oerrnet.OpError类型的结构,而oerr.Err net.DNSError 类型的结构且字段为{Err:"no such host", Name:"unknownserver", Server:"", IsTimeout:false, IsTemporary:false},则为有可能访问struct的字段吗?或者我在这里误解了一个关键概念?

谢谢,

-Martin

1 个答案:

答案 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结构),然后您可以访问该结构的(导出)字段。