我正在 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 關注
- 162 瀏覽
添加回答
舉報
0/150
提交
取消