2015-10-30 6 views
5

私のコードは次のようであるnilでチェックgolangしますどのように私は<code>req, _ := http.NewRequest("GET", "http://www.github.com", content)</code>を使用する場合、それは例外で放出する、変数が

panic: runtime error: invalid memory address or nil pointer dereference 
[signal 0xb code=0xffffffff addr=0x0 pc=0xaab78] 

goroutine 1 [running]: 
net/http.NewRequest(0x34f3b8, 0x3, 0x378020, 0x15, 0xfeec4350, 0x0, 0x10738801, 0x0, 0x0, 0x107000e0) 
    /usr/local/go/src/net/http/request.go:570 +0x498 
main.main() 
    /tmp/sandbox056954284/main.go:17 +0xe0 

を私はreq, _ := http.NewRequest("GET", "http://www.github.com", nil)を使用する場合、それは、なぜ動作しますか?私は

package main 

import (
    "bytes" 
    "net/http" 
) 


func main() { 
    client := &http.Client{} 
    var content *bytes.Reader 
    content = nil 
    req, _ := http.NewRequest("GET", "http://www.github.com", content) 
    resp, _ := client.Do(req) 
    defer resp.Body.Close() 
} 
+3

https://golang.org/doc/faq#nil_errorを参照してください。 –

答えて

4

goインターフェイスは、タイプと値で構成されます。型と値の両方がnilの場合、インターフェイスはnilになりません。型を指定しましたが値はありません:したがって、NewRequestは、nil構造体(インターフェイスの値)で読み込みを試みました。

+0

しかしなぜ 'content == nil'が' true'を返すのですか – sundq

+0

bytes.Readerは構造体であり、Interfaceではないからです。しかし、http.NewRequestはインターフェイスであるio.Readerを取ります。あなたは型に渡しますが、値はありません - >インタフェースはnilではありません。 – 0x434D53

+0

参照:https://play.golang.org/p/kKaLDCQBA6 – 0x434D53

1

コンテンツは、デフォルトではnilである第三引数の値を設定する方法、それをしない、それは

も、エラーがNewRequestから返さ無視している割り当てる必要はありません。なぜそれがリクエストを生成できないのかをあなたに伝えています。

if req == nil { 
// handle nil req 
} else { 
// use req 
} 

が、前に述べたように、それははるかです:あなたは本当にただ、REQがnilであるかどうかを知りたい行うと言ったことすべて

req, err := http.NewRequest("GET", "http://www.github.com", content) 
if err != nil { 
    // log or complain... req is nil here 
} else { 
    // do something with req 
} 

通常のエラー処理は次のようなものになるだろうエラーを処理する方が良い。 errがnilでなければ、基本的にreqが何か有効であると信じることはできません。

関連する問題

 関連する問題