返回
Go面试题:defer的使用注意事项,面试官最爱的5道题目精讲
后端
2023-12-30 21:18:01
前言
Go语言中的defer是一个非常重要的并发编程特性,它允许我们在函数返回之前执行一些清理操作或其他任务。defer在Go面试中也经常被问到,本文将精讲5道常见的Go面试中关于defer使用注意事项的题目,帮助你深入理解defer的语义,轻松应对面试挑战。
题目1
package main
import "fmt"
func main() {
defer fmt.Println("A")
defer fmt.Println("B")
fmt.Println("C")
}
问题: 这段代码输出是什么?
答案:
C
B
A
解析: defer会在函数返回之前执行,后声明的defer会先执行。因此,这段代码先输出"C",然后输出"B",最后输出"A"。
题目2
package main
import "fmt"
func main() {
i := 0
defer fmt.Println(i)
i++
}
问题: 这段代码输出是什么?
答案:
0
解析: defer会捕获变量的值,而不是引用。因此,即使在defer执行之前变量的值发生了变化,defer仍然会输出变量最初的值。
题目3
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("recovered from panic:", r)
}
}()
panic("something bad happened")
}
问题: 这段代码输出是什么?
答案:
recovered from panic: something bad happened
解析: defer函数可以捕获panic,并通过recover()函数恢复程序的执行。
题目4
package main
import "fmt"
func main() {
defer func() {
fmt.Println("A")
return
}()
defer fmt.Println("B")
fmt.Println("C")
}
问题: 这段代码输出是什么?
答案:
C
A
B
解析: defer函数内部的return语句会导致函数立即返回,后面的defer函数不会执行。因此,这段代码先输出"C",然后输出"A",最后输出"B"。
题目5
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
}
问题: 这段代码输出是什么?
答案:
2
1
0
解析: defer会捕获循环变量的值,而不是引用。因此,每个defer函数都会输出循环结束时的变量值。