2017-01-25 6 views
0

아래 코드는 HTTP 호출을 만들고 응답을 받고, 응답을 닫고, ID가있는 채널에 쓰는 10,000 개의 go 루틴을 엽니 다.golang 채널을 사용한 세그먼트 위반

두 번째 for 루프에서 이전 버퍼링 된 채널에서 이전 이동 루틴의 ID를 인쇄합니다.

이로 인해 세그먼트 위반이 발생하며 그 이유를 파악할 수 없습니다.

공황 :

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

코드 : API를 호출 할 때 당신은 어떤 오류를 확인하지 않는

package main 

import (
    "fmt" 
    "net/http" 
) 

func main() { 
    requests := 10000 
    ch := make(chan string, requests) 
    for i := 1; i <= requests; i++ { 
     go func(iter int) { 
      fmt.Println(iter) 
      resp, _ := http.Get("http://localhost:8080/api/project") 
      resp.Body.Close() 
      ch <- fmt.Sprint("%i", iter) 
     }(i) 
    } 
    for i := 1; i <= requests; i++ { 
     fmt.Println(<-ch) 
    } 
} 
+4

를 항상 확인, 오류를. – JimB

답변

3

. 따라서 결코 도착하지 않은 응답을 닫으려고 할 때의 오류.

이 코드는 당황하지 않습니다

package main 

import (
    "fmt" 
    "net/http" 
) 

func main() { 
    requests := 10000 
    ch := make(chan string, requests) 
    for i := 1; i <= requests; i++ { 
     go func(iter int) { 
      fmt.Println(iter) 
      resp, err := http.Get("http://localhost:8080/api/project") 
      if (err == nil) { 
       resp.Body.Close() 
      } 
      ch <- fmt.Sprint(iter) 
     }(i) 
    } 
    for i := 1; i <= requests; i++ { 
     fmt.Println(<-ch) 
    } 
}