2014-01-30 50 views
0

我試圖多次查詢一個網站,但我得到:夠程給出錯誤

panic: runtime error: invalid memory address or nil pointer dereference

[signal 0xb code=0x1 addr=0x38 pc=0x400cca]

package main 

import (
    "fmt" 
    "net/http" 
) 

var urls = []string{ 
    "http://site-centos-64:8080/examples/abc1.jsp", 
} 

type HttpResponse struct { 
    url  string 
    response *http.Response 
    err  error 
} 
var ch = make(chan *HttpResponse, 1000) // buffered 

func abc(i int){ 
     for _, url := range urls { 
       resp, err := http.Get(url) 
       resp.Body.Close() 
       ch <- &HttpResponse{url, resp, err} 
     } 
} 
func asyncHttpGets(urls []string) []*HttpResponse { 
    responses := []*HttpResponse{} 
    for i:=0;i<1000;i++{ 
     go abc(i) 
    } 
    for { 
     select { 
     case r := <-ch: 
      responses = append(responses, r) 
      if len(responses) == 1000 { 
       return responses 
      } 

     } 
    } 

    return responses 

} 

func main() { 
    results := asyncHttpGets(urls) 
    for _, result := range results { 
     fmt.Printf("%s status: %s\n", result.url, 
      result.response.Status) 
    } 
} 

作品精絕當我500次做到這一點。

回答

1

go stacktrace包含哪一行代碼導致了恐慌。可能有很多goroutines正在運行,但你可以grep你的文件名。 我假設你的服務器有一些連接問題。

正確處理err在你的abc函數應該告訴你更多。
如果發生錯誤,請不要撥打resp.Body.Close()。而在你的main功能result.response.Status也不會工作。