2015-10-30 16 views
5

mein Code wie das ist, wenn ich req, _ := http.NewRequest("GET", "http://www.github.com", content) verwenden, wird es Ausnahme emittieren:, wie man golang eine Variable überprüfen ist gleich Null

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 

aber wenn ich req, _ := http.NewRequest("GET", "http://www.github.com", nil) verwenden, es funktioniert, warum? wie ich das dritte Argument Wert

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

Siehe https://golang.org/doc/faq#nil_error. –

Antwort

4

Eine Go-Schnittstelle besteht aus einem Typ und einem Wert. Eine Schnittstelle ist nur dann null, wenn sowohl der Typ als auch der Wert null sind. Sie haben einen Typ, aber keinen Wert angegeben: Daher hat NewRequest versucht, Read auf einer nil-Struktur aufzurufen (der Wert der Schnittstelle).

+0

Aber warum 'content == nil' gibt' true' zurück – sundq

+0

Weil bytes.Reader eine Struktur ist, keine Schnittstelle. Aber http.NewRequest benötigt einen io.Reader, der eine Schnittstelle ist. Sie übergeben es über einen Typ, aber ohne Wert -> die Schnittstelle ist nicht Null. – 0x434D53

+0

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

1

Inhalt Null ist standardmäßig, müssen es

auch nicht zuordnen, Sie ignorieren die Fehler von NewRequest zurückgegeben, tu das nicht. Es erklärt Ihnen, warum es keine Anfrage generieren kann.

normale Fehlerbehandlung wäre so etwas wie:

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 
} 

alles, was gesagt, wenn Sie wirklich wollen nur wissen, ob req gleich Null ist, zu tun:

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

aber wie bereits erwähnt, ist es viel ist besser, um den Fehler zu behandeln. Wenn irr nicht nil ist, dann kann man im Grunde nicht darauf vertrauen, dass irgendwas Gültiges ist.

Verwandte Themen