実装するインターフェイスを使用するio.ReadWriteCloserと、通常io.EOF、io.ErrUnexpectedEOFエラーが返されます。net.Listenerを実装io.Closerしているため、このエラーも返されると予想されますが、残念ながらこの規則には従いません。代わりに、net.go でプライベートに宣言された errClosing を返します。
によって返されるエラーnet.Listenerは でラップされnet.OpErrorます。この構造体には、役立つ可能性のある追加情報が含まれています。具体的には、"Op" と "Err" です。「Op」は、エラーが発生した場所を示します。実行するClose() errorと、「accept」が返されます。ドキュメントには、「読み取り」と「書き込み」を戻すこともできると書かれています。
を取得するには、次のようnet.OpErrorにします。
err := server.Serve(l)
if opErr, ok := err.(*net.OpError); ok {
// opErr.Op, opErr.Err, ...
}
net.Listenerまたは、次のように (常に a を返すと仮定してnet.OpError):
err := server.Serve(l).(*net.OpError)
net.OptError.Err は元のエラーを返します。これは、エラーがエクスポートされた場合に役立ちます。いずれにせよ、将来のバージョンで壊れる可能性があるため、文字列をチェックすることはお勧めしません。持っていないエクスポートされたエラーとエラーを直接比較することをお勧めします。
net.OptError関数もTemporary() bool宣言されています。net/httpパッケージはこれを使用して、増加する間隔で接続を再確立します。したがって、 の場合、net/http返されるエラーは を呼び出した結果であると想定しますClose() error。それ以外の場合Temporary() boolは true が返さnet/httpれます。