请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

有的时候运行会报错 invalid memory address or nil pointer dereference

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x40 pc=0x120c0dc]

goroutine 83 [running]:
learngo/crawler/fetcher.Fetch(0xc4202f14a0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/wuyinhua/go/src/learngo/crawler/fetcher/fetcher.go:49 +0x2ec
learngo/crawler/engine.worker(0xc4202f14a0, 0x24, 0xc420506150, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
    /Users/wuyinhua/go/src/learngo/crawler/engine/simple.go:37 +0x68
learngo/crawler/engine.createWorker.func1(0x12fdda0, 0xc4200a0f00, 0xc4200979e0, 0xc420096120)
    /Users/wuyinhua/go/src/learngo/crawler/engine/concurruntengine.go:51 +0xcc
created by learngo/crawler/engine.createWorker
    /Users/wuyinhua/go/src/learngo/crawler/engine/concurruntengine.go:47 +0x76



fetch 代码我改了下header


func Fetch(url string) ([]byte, error) {
  // <-rateLimiter
  request, err := http.NewRequest(http.MethodGet, url, nil)
  if err != nil {
     return nil, err
  }
  request.Header.Add("Accept", `text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8`)
  request.Header.Add("Accept-Language", `gzh-CN,zh;q=0.9`)
  request.Header.Add("Cache-Control", `max-age=0`)
  request.Header.Add("Connection", `keep-alive`)
  request.Header.Add("Cookie", `sid=kw4Q8rFPSB704BnO0CtJ; ipCityCode=10103000; ipOfflineCityCode=10103000; JSESSIONID=abccFnBOwlANG6LwxVYsw; CHANNEL=^~subid=2^~refererHost=^~channelId=903404^~refererHost=www.baidu.com^~; Hm_lvt_2c8ad67df9e787ad29dbd54ee608f5d2=1531749150,1532156726; clientp=38624; Hm_lpvt_2c8ad67df9e787ad29dbd54ee608f5d2=1532171973`)
  // reqest.Header.Add("Accept-Encoding", "gzip, deflate")
  request.Header.Add("Host", "album.zhenai.com")
  request.Header.Add("Referer", "http://www.zhenai.com/zhenghun/shanghai/3")
  request.Header.Add("Upgrade-Insecure-Requests", "1")
  request.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36")
  client := http.Client{}
  resp, err := client.Do(request)
  // resp, err := http.Get(url)
  defer resp.Body.Close()
  if err != nil {
     return nil, err
  }
  if resp.StatusCode != http.StatusOK {
     return nil, fmt.Errorf("wrong http status code:%d", resp.StatusCode)
  }
  bodyReader := bufio.NewReader(resp.Body)
  e := determineEncoding(bodyReader)
  utf8Reader := transform.NewReader(bodyReader, e.NewDecoder())
  return ioutil.ReadAll(utf8Reader)
}

正在回答

2回答

resp, err := client.Do(req)
if resp != nil {
  defer resp.Body.Close()
}
if err != nil {
  return nil, err
}

0 回复 有任何疑惑可以回复我~
  • 提问者 hehehei #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-07-22 21:17:50
提问者 hehehei 2018-07-22 15:04:09

  defer resp.Body.Close()
  if err != nil {
     return nil, err
  }

defer应该写在if下面,出现这个问题是请求超时,但是获取resp失败,所以close会出错,deffer如果在if下面,就会先返回timeout的错误,不会去close

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号