2015-10-30 19 views
5

mã của tôi là như thế này, khi tôi sử dụng req, _ := http.NewRequest("GET", "http://www.github.com", content), nó sẽ phát ra ngoại lệ:cách golang kiểm tra một biến là con số không

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 

nhưng khi tôi sử dụng req, _ := http.NewRequest("GET", "http://www.github.com", nil), nó hoạt động, tại sao? làm thế nào tôi thiết lập giá trị số thứ ba

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

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

Trả lời

4

Giao diện đi bao gồm loại và giá trị. Một giao diện chỉ là nil nếu cả hai loại và giá trị là nil. Bạn đã cung cấp một loại nhưng không có giá trị: Do đó NewRequest cố gắng gọi Đọc trên cấu trúc nil (giá trị của giao diện).

+0

Nhưng tại sao 'content == nil' trả về' true' – sundq

+0

Vì byte.Reader là một cấu trúc, không phải là Giao diện. Nhưng http.NewRequest có một io.Reader, là một giao diện. Bạn đưa nó qua một kiểu, nhưng không có giá trị -> giao diện không phải là số không. – 0x434D53

+0

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

1

nội dung là con số không theo mặc định, không cần phải gán nó

cũng có, bạn đang bỏ qua những lỗi trở về từ NewRequest, không làm điều đó. Nó cho bạn biết lý do tại sao nó không thể tạo ra một yêu cầu.

xử lý lỗi thông thường sẽ là một cái gì đó như:

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 
} 

tất cả những gì đã nói nếu bạn thực sự chỉ muốn biết nếu req là con số không, làm:

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

nhưng như đã đề cập trước đó, nó nhiều tốt hơn để xử lý lỗi. nếu err không nil, sau đó bạn về cơ bản không thể tin tưởng req được bất cứ điều gì hợp lệ.

Các vấn đề liên quan