2016-06-23 3 views
0

GoでSSHクライアント接続を開始していますが、エラーが返されたときに詳細なエラーデータにアクセスしようとしています。私はこれを使って、net.DNSErrorNameフィールドの内容を印刷しようとしていますGo 'net'パッケージから 'OpError'構造体に埋め込まれた 'DNSError'構造体のフィールドにアクセスできますか?

&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 

:これらのエラーデータの2行を返す

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()) 
} 

私は現在、このコードを使用しています:

fmt.Println(a.Name) 

ただし、私はこのエラーを取得するコードmpile:oerrはタイプnet.OpErroroerr.Errの構造体である場合net.DNSErrorタイプの構造体であるとフィールド{Err:"no such host", Name:"unknownserver", Server:"", IsTimeout:false, IsTemporary:false}を持って

a.Name undefined (type error has no field or method Name) 

を、それが構造体のフィールドにアクセスすることは可能でしょうか?あるいは私はここで重要な概念を誤解していますか?

おかげで、

答えて

0

-Martin条件付き第二のタイプのアサーションを使用する:

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()) 
} 

第型アサーションが*net.OpErrorとしてoerrを設定するが、その構造のErrフィールドがですerrorと入力します。これは組み込みのインターフェイスタイプであるため(フィールドがないため)そのエラーのフィールドにアクセスするには、まずそれが構造体(具体的には、*net.DNSError構造体)であると主張し、その構造体の(エクスポートされた)フィールドにアクセスする必要があります。

+0

ありがとうございました! 2番目のタイプのアサーションについてのあなたの説明は、 'error'インターフェースに関してまだ成功しなかったドキュメントとソースのさまざまな情報を明確にしました。しかし、今この側面が明確になり、私はあなたの例のおかげで、望ましいデータを抽出することができました。 –

関連する問題