2016-05-24 13 views
0

多くの同時呼び出しを使用してスケーリングするまで、私のコードは完全に機能します。これは、クライアントにGetリクエストを要求することによって機能します。Golang、ポインタの参照が無効であるか無効なメモリアドレス

は、これは私が取得していますものです:

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

goroutine 125 [running]: 
runtime.panic(0x697480, 0x850d13) 
    /usr/lib/go/src/pkg/runtime/panic.c:279 +0xf5 
main.concurrent(0x25e5) 
    /home/maker/go/src/GoBot/GoBot.go:19 +0x1a9 
created by main.main 
    /home/maker/go/src/GoBot/GoBot.go:51 +0x224 

私はそれがクラッシュした要求の多くを作るとき、私は適切にエラーを処理しないと思います。

func concurrent(n uint64) { 
    for i := n; i < n+11; i++ { 
      member, err := s.GetUser(i) 
      output <- fmt.Sprint(member.Username) //This is line 19 that triggers the error 
      if err != nil && member != nil { 
       continue 
      } 
    } 
defer wg.Done() 
} 

どうすればこの問題を解決できますか?ここs.GetUserため 参考文献: https://github.com/njasm/gosoundcloud/blob/master/soundcloud.go#L274

+0

'GetUser'から返されたエラーがあっても、19行目で' member'を使っています。並行処理に関連しているようには思えません。おそらく、あなたの並行バージョンが 'GetUser'をより多く呼び出すからです。 –

答えて

1

まず、あなたは現在、無視しているGetUserの戻り値をチェックすることでパニックを防ぐことができます。

 member, err := s.GetUser(i) 
     if err != nil { 
      // handle error 
     } 
     if member != nil { // prevents the panic attempting to access Username on nil instance of user/member 
      output <- fmt.Sprint(member.Username) //This is line 19 that triggers the error 
      if err != nil && member != nil { 
       continue 
      } 
     } 

さらに、GetUserとは何ですか? HTTP GETを作成している場合、通常はアプリケーションが返るまでブロックされます。つまり、エラーをチェックするとHTTP 404,403,500などのようになります。

GetUserへの呼び出しが同時だった場合、あなたはあなたがいない持っているのでGetUsermember.Usernameにアクセスしようとする試み、以下のコードはnilパニックを引き起こして戻ってきたが、私はそれが起こる可能性がどのように表示されない問題が発生した可能性がありそこにゴルーチン。単純なブロッキングコールでなければなりません。上記の提案が問題の根本原因につながるわけではない場合は、GetUserの結果を使用して質問を編集して実装してください。

+0

実際、私はgoroutinesに関数を作ります。それを行うより良い方法がありますか、それを解決するべきであることだけをチェックすることによってですか? @evanmcdonnal – Juanvulcano

+0

@Juanvulcano私は 'go concurrent(10)'のようなgoルーチンで 'concurrent'を呼び出していると仮定しますが、' concurrent'の中にgoroutinesはありませんので、そのスコープ内には並行性はありません。それは、ちょうどあなたのためにチェックを行うだろうと言われて、私は根本的な原因は、 'GetUser'で失敗していない場合に驚かれるだろう – evanmcdonnal

+0

私はforループを使用しています。 https://play.golang.org/p/WyjoLFzCVWそれは間違っているのですか? @evanmcdonnal – Juanvulcano

関連する問題