さて、私はこのコードを持っています
func registerDomain(domainName string, n int) bool {
//building the request here
resp, errr := client.Do(r)
if errr != nil {
if n == 1 {
return false
}
registerDomain(domainName, n-1)
}
bodyBytes, err2 := ioutil.ReadAll(resp.Body)
if err2 == nil {
resp.Body.Close()
//handle bodyBytes
//if the response is how it should be return true, if it's not call the function again with n-1
} else { //if there is an error reading the response
resp.Body.Close()
if n == 1 {
return false
}
registerDomain(domainName, n-1)
}
return false //it should never reach this line
}
説明:
何かが正しくない場合に関数が再試行する回数を表す引数 n (5 としましょう) を指定して関数を呼び出します。何か問題が発生するたびに、n-1 で再帰呼び出しを行うため、n=1 に達するとあきらめて false を返します。このコードは実際には問題なく動作し、本来の動作を行います。応答が正しくない場合は、再帰的に自分自身を呼び出し、2 回目 (または 3 回目、4 回目..) に動作します。n=1 になる前に問題が修正されない場合は、false を返します。
問題:
これは、約 17 時間実行されるはずの大きなコードの一部であり、次の行で本文から読み取ろうとするとパニックになります。
bodyBytes, err2 := ioutil.ReadAll(resp.Body)
パニック: ランタイム エラー: 無効なメモリ アドレスまたは nil ポインター逆参照と表示されます。これはおそらく、存在しない resp.Body から読み取ろうとしていることを意味していることがわかりましたが、Go のドキュメントには、 err が nil の場合、 resp には常に nil 以外の resp.Body が含まれていると明確に記載されています。
だから、私の頭の中では、おそらく再帰呼び出しを伴うものです。私にとって理にかなっている唯一のことは、このシナリオです: エラーが nil ではない (これは resp.Body が存在しないことを意味します) としましょう。 1 の場合、n=4 で再び自分自身を呼び出します。今回はすべてが正常で、2 番目の関数が最初の関数に true を返しますが、最初の関数は実行を続行し、存在しない resp.Body から読み取ろうとするとします。それはパニックを引き起こし、ここにいます...
だから、私が必要としているのは、再帰関数がどのように機能するかを正確に知っている人です。
とにかく、ありがとう!:)
更新:大丈夫でした。私のコードはもうパニックにならず、私もそうではありません。どうもありがとうございました! (ここがアップデートの対象かどうかはわかりません)