gpt4 book ai didi

recursion - Go中的递归函数,如果内层函数返回,外层函数是否继续正常执行?

转载 作者:IT王子 更新时间:2023-10-29 01:33:43 26 4
gpt4 key购买 nike

好的,所以我有这段代码

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。这段代码在实践中运行良好,它做了它应该做的事情,有时当响应不正确时它递归地调用自己并且它在第二次(或第三次,第四次......)时工作。如果问题在 n=1 之前未解决,则返回 false。

问题:

这是一段应该运行大约 17 小时的大代码的一部分,当它有时在这一行尝试从正文中读取时会出现 panic :

bodyBytes, err2 := ioutil.ReadAll(resp.Body)

它说 panic :运行时错误:无效的内存地址或零指针取消引用。现在我知道这可能意味着它正在尝试从不存在的 resp.Body 中读取,但 Go documentation明确指出当err 为nil 时,resp 总是包含一个非nil 的resp.Body

所以,在我看来,这可能与递归调用有关。 唯一对我来说有意义的是这种情况:假设 errr 不是 nil(这意味着 resp.Body 不存在),所以它进入 if errr 内部! = nil 并且因为 n!=1,它会再次用 n=4 调用自己。假设这次一切正常,第二个函数向第一个函数返回 true 第一个函数继续执行并尝试从不存在的 resp.Body 中读取。这会引起 panic ,我们在这里......

所以,我需要的是一个确切知道递归函数如何工作的人,如果不是,我可以在读取它之前以某种方式检查 resp.Body 的存在,或者有帮助的东西。

还是谢谢! :)

更新:您一切都好,我的代码不再 panic ,我也不再 panic 。非常感谢! (我不确定这是不是更新的地方)

最佳答案

改变

registerDomain(domainName, n-1)

return registerDomain(domainName, n-1)

这样外部函数将不会继续执行,也不会从 nil 主体中读取。

关于recursion - Go中的递归函数,如果内层函数返回,外层函数是否继续正常执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27924938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com