好的,所以我有這段代碼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}解釋:我使用參數(shù) n(假設(shè)為 5)調(diào)用該函數(shù),該參數(shù)表示如果出現(xiàn)問題,該函數(shù)將重試的次數(shù)。每次出現(xiàn)問題時,我都會使用 n-1 進行遞歸調(diào)用,因此當(dāng)它達到 n=1 時,它放棄并返回 false。這段代碼在實踐中運行良好,它完成了它應(yīng)該做的事情,有時當(dāng)響應(yīng)不正確時,它會遞歸調(diào)用自己,并在第二次(或第三次、第四次......)時間工作。當(dāng)問題在 n=1 之前沒有解決時,它返回 false。問題:這是一個應(yīng)該運行大約 17 小時的大代碼的一部分,當(dāng)它試圖從這一行讀取正文時,它有時會出現(xiàn)恐慌:bodyBytes, err2 := ioutil.ReadAll(resp.Body)它說恐慌:運行時錯誤:無效的內(nèi)存地址或零指針取消引用?,F(xiàn)在我知道這可能意味著它試圖從不存在的 resp.Body 中讀取,但是Go 文檔明確指出,當(dāng) err 為零時, resp 總是包含一個非零的 resp.Body。所以,在我看來,這可能與遞歸調(diào)用有關(guān)。該只說對我來說很有意義的事情是這樣的情景:讓說,errr不為零(這意味著resp.Body不存在),如此這般的,如果errr內(nèi)部=零,因為N =! 1,它將以 n=4 再次調(diào)用自己。比方說,這個時候一切都是理所應(yīng)當(dāng)?shù)亩诙€函數(shù)返回true的第一個BUT的第一個與執(zhí)行,并繼續(xù)嘗試從一個不存在的resp.Body閱讀。這會引起恐慌,我們在這里......所以,我需要的是一個確切知道遞歸函數(shù)如何工作的人,如果不是這樣,我能否在閱讀表單之前以某種方式檢查 resp.Body 的存在,或者有幫助的東西。不管怎么說,多謝拉!:)更新:你沒事,我的代碼不再恐慌,我也一樣。非常感謝?。ㄎ也淮_定這是不是更新的地方)
Go中的遞歸函數(shù),如果內(nèi)部函數(shù)返回,外部函數(shù)是否繼續(xù)正常執(zhí)行?
慕桂英3389331
2021-09-10 20:57:00