下面这段代码输出什么?
func f(n int) (r int) {
defer func() {
r += n
recover()
}()
var f func()
defer f()
f = func() {
r += 2
}
return n + 1
}
func main() {
fmt.Println(f(3))
}
下面这段代码输出什么?
func f(n int) (r int) {
defer func() {
r += n
recover()
}()
var f func()
defer f()
f = func() {
r += 2
}
return n + 1
}
func main() {
fmt.Println(f(3))
}
`单行代码`
di
到-求讲解
好难,不懂
mark
m
来个大哥解释一下
m
应该是defer注册延迟执行函数时, f 未初始化, 为nil, f()会panic, r += 2不会执行, 若把defer f()与f = func() {r += 2}换一下位置, 值就是9了
6楼 @brunce
同求讲解
mark
个人见解:
defer f()
可知,f()是没有定义的?(存疑)所以报了panic,而在defer func()
里面的recover()
处理了这个panic
,保证了整个程序能够执行完return n+1
而是n+1+n
的结果(第三点详细解释)f()
函数的最后一行为return n+1
,也就是return 3+1
,函数f()
的返回参数为r int
,所以r = 3 + 1
,再到defer func()
的r+=n
也就是r = n + 1 + n
即r = 3 + 1 + 3
,然后返回r的值,就是7我现在想问一下,为什么出现panic,或者 panic的问题在哪里。。。 求大神指教!!!!
2022-04-25
可以参考 https://studygolang.com/articles/27408 对于defer的知识点
这个题目很有意思,如果把defer f()这一行改为f(),返回值就会变为3
mark
mark
mk
mark
defer与panic
有意思
赞
需要脑补知识点。。。
👍
知识点是 panic、recover
defer panic
1111
7,defer f()会恐慌。
1
https://studygolang.com/articles/27408
f函数defer的时候还没有具体的内容
defer f() ,defer注册时候会panic ,3 + 4 = 7
mark
打卡
makr
yep
mark
defer f()会 panic: runtime error: invalid memory address or nil pointer dereference
这里在我的博客里进行了讲解,不懂的uu可以参考一下,若有不对的地方,欢迎指出 解释如下:
首先使用defer关键字注册了一个匿名函数,然后这个匿名函数在函数f返回时执行。在这个匿名函数里,使用了recover(),这意味着它可以恢复panic。 接着定义了一个变量f,类型为func(),这里由于只声明了,但是没有定义,故变量f是一个nil函数。 然后使用defer关键字将f变量注册成延迟函数,这个延迟函数在函数f返回时会执行,但这个匿名函数是一个nil函数,因此在执行这个延迟函数时会触发panic 接下来是对变量f的定义 return n + 1此时,返回值变量r = n + 1,接着执行defer注册的延迟函数,因为defer函数的执行顺序是先进后出的,故先执行变量f,但由于这里注册的是一个nil函数,因此触发panic,接着执行最开始注册的匿名函数,此时r = n + 1 + n,遇到了recover(),所以恢复了panic,将r的值返回 最后返回给主函数的值r = n + 1 + n = 7
mark
mark
mark
mark
mark
声明的函数变量是 nil,所以 defer f() 的时候,会报 panic:nil pointer;所以会执行第一个 defer,第一个 defer 当中,r += n,即 r= 3;后面 recover(),执行 return;且 n + 1不是命名的返回值参数,所以 r += (n + 1),即为 7
mark
mark
强