Golang,http请求中没有

时间:2016-05-25 23:14:30

标签: go concurrency

我正在创建一个Go脚本,以便从API中获取尽可能多的http请求。

我在soundcloud.GetUser(i)的行中得到一个nil指针引用,当我用多个goroutine调用worker()时,确切地说超过200个。

这是我准确的错误。

goroutine 28 [running]:
runtime.panic(0x75fca0, 0x98cf13)
/usr/lib/go/src/pkg/runtime/panic.c:279 +0xf5 www.github.com/Juanvulcano/gosoundcloud%2egit.processAndUnmarshalResponses(0x0, 0x7f1d338e9fd0, 0xc209467a10, 0x780a60, 0xc20809c300, 0x0, 0x0)
      /home/maker/go/src/www.github.com/Juanvulcano/gosoundcloud.git/gosoundcloud.go:31 +0x413
www.github.com/Juanvulcano/gosoundcloud%2egit.(*SoundcloudApi).GetUser(0xc208040520, 0x2, 0x7f1d41e81f40, 0x0, 0x0)
    /home/maker/go/src/www.github.com/Juanvulcano/gosoundcloud.git/soundcloud.go:295 +0x1b1
main.worker()
    /home/maker/go/src/GoBot/GoBot.go:28 +0xdd
created by main.main
    /home/maker/go/src/GoBot/GoBot.go:71 +0x55d

这里我附上了我的代码的重要部分。

func worker() {
   defer wg.Done()
   for i := range input {
       member,  err := soundcloud.GetUser(uint64(i))
       if err != nil{
           fmt.Println(err)
       }
       if member != nil {
           output <- fmt.Sprint(member.Username)
       }
    }
}    


func main() {    
    var err error
    if err = soundcloud.PasswordCredentialsToken("email", "password"); err != nil {
        fmt.Println(err)
        os.Exit(1)
    }  
    go func() {    
        for i := 1; i < 1000; i++ {
                input <- i
       }
       close(input)
       wg.Wait()
       close(output)
    }()

    for i := 0; i < 200; i++ {
        wg.Add(1)
        go worker()
    }    
    printOutput()
}

1 个答案:

答案 0 :(得分:1)

在函数中:

func processAndUnmarshalResponses(resp *http.Response, err error, holder interface{}) error {
    defer resp.Body.Close()
    if err != nil {
        return err
    }

在检查错误之前,您是在推迟resp.Body.Close()。如果出现错误,resp将为零,解除引用将会出现紧急情况。始终先进行错误检查。