golang http.Get 一跑就崩,求解

报错信息

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x38 pc=0x400f21]

goroutine 6 [running]:
runtime.panic(0x5f85e0, 0x877828)
    /usr/local/go/src/pkg/runtime/panic.c:266 +0xb6
main.func·001()
    /root/go/query.go:46 +0x61
created by main.gethtml
    /root/go/query.go:48 +0x67

goroutine 1 [chan receive]:
main.main()
    /root/go/query.go:59 +0x176

goroutine 3 [select]:
net/http.(*Transport).getConn(0xc210059200, 0xc210072030, 0xc210072030, 0x0, 0x0)
    /usr/local/go/src/pkg/net/http/transport.go:424 +0x24d
net/http.(*Transport).RoundTrip(0xc210059200, 0xc210070000, 0xc21006f094, 0x0, 0x0)
    /usr/local/go/src/pkg/net/http/transport.go:182 +0x340
net/http.send(0xc210070000, 0x7f19e12d42b8, 0xc210059200, 0x0, 0x0, ...)
    /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0x87c540, 0xc210070000, 0x12, 0x41ff61, 0x8)
    /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0x87c540, 0xc210070000, 0x6aac88, 0x0, 0x0, ...)
    /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Get(0x87c540, 0x6616b0, 0x12, 0x7f19e1150f70, 0x0, ...)
    /usr/local/go/src/pkg/net/http/client.go:248 +0xb2
net/http.Get(0x6616b0, 0x12, 0x6616b0, 0x0, 0x0)
    /usr/local/go/src/pkg/net/http/client.go:225 +0x50
main.func·001()
    /root/go/query.go:44 +0x4f
created by main.gethtml
    /root/go/query.go:48 +0x67

代码如下

package main
import (
                "net/http"
                "fmt"
                "runtime"
       )
var urllist = [...]string{
        "http://www.baidu.com",
        "http://www.google.com",
        "http://www.360.com",
        "http://www.qq.com",
        "http://www.sina.com",
        "http://www.sohu.com",
        "http://www.jd.com",
        "http://www.taobao.com",
        "http://www.chingyu.net",
        "http://www.dajie.com",
        "http://www.56.com",
        "http://www.163.com",
        "http://www.weibo.com",
        "http://www.263.com",
        "http://www.duowan.com",
        "http://www.duokan.com",
        "http://www.youku.com",
        "http://www.tudou.com",
        "http://www.zhihu.com",
        "http://www.21cn.com",
        "http://www.chinaunix.com",
        "http://www.oschina.com",
        "http://www.iteye.com",
}

var worker = runtime.NumCPU()


type query struct {
    url chan string
    resp chan []string
    //resp chan *http.Response
}

func gethtml(q query) {                                                                                                                                          
    go func() {                                                                                                                                                  
        resp,_ := http.Get( <-q.url)                                                                                                                             
        //q.resp <- resp                                                                                                                                         
        q.resp <- resp.Header["Server"]                                                                                                                          
        resp.Body.Close()                                                                                                                                        
    }()                                                                                                                                                          

}                                                                                                                                                                

func main() {                                                                                                                                                    
    runtime.GOMAXPROCS(runtime.NumCPU())                                                                                                                         
    q := query{make(chan string, len(urllist)), make(chan []string, len(urllist))}                                                                               
    for _,i := range urllist{                                                                                                                                    
          gethtml(q)                                                                                                                                             
          q.url <- i                                                                                                                                             
     }                                                                                                                                                           
     for _,_ = range urllist {
        fmt.Println(<-q.resp)
    }                                                                                                              
}

阅读 8.5k
1 个回答

楼主是不是想并发请求服务器,获取http头的server

把你的代码改了下

package main

import (
    "fmt"
    "net/http"
    "runtime"
)

var urllist = [...]string{
    "http://www.baidu.com",
    "http://www.google.com",
    "http://www.360.com",
    "http://www.qq.com",
    "http://www.sina.com",
    "http://www.sohu.com",
    "http://www.jd.com",
    "http://www.taobao.com",
    "http://www.chingyu.net",
    "http://www.dajie.com",
    "http://www.56.com",
    "http://www.163.com",
    "http://www.weibo.com",
    "http://www.263.com",
    "http://www.duowan.com",
    "http://www.duokan.com",
    "http://www.youku.com",
    "http://www.tudou.com",
    "http://www.zhihu.com",
    "http://www.21cn.com",
    "http://www.chinaunix.com",
    "http://www.oschina.com",
    "http://www.iteye.com",
}

var worker = runtime.NumCPU()

func gethtml(url string, respChan chan []string) {
    resp, err := http.Get(url)
    if err != nil {
        fmt.Println(err)
        return
    }
    respChan <- resp.Header["Server"]
    resp.Body.Close()
}

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    respChan := make(chan []string)

    for _, url := range urllist {
        go gethtml(url, respChan)
    }

    for i := 0; i < len(urllist); i++ {
        fmt.Println(<-respChan)
    }
}

结果

lidashuang@lds:~/tmp|⇒  go run a.go
[nginx/1.0.15]
Get http://www.oschina.com: dial tcp 127.0.0.1:80: connection refused
[squid/3.1.18]
[ITeye SERVER]
[zhihu_nginx]
[Tengine/1.5.0]
[Apache]
[Apache/2.2.18 (Unix) PHP/5.3.6]
[SWS]
[Apache]
[JDWS]
[nginx/1.2.8]
[Tengine]
[BWS/1.1]
[nginx]
[jinjingwww01]
[nginx/1.4.4]
[]
[gws]
[nginx]
[Tengine]
[nginx/1.5.2]
[Apache/2.2.25 (Unix) Communique/4.1.2]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题