返回

Go面试题:defer的使用注意事项,面试官最爱的5道题目精讲

后端

前言

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函数都会输出循环结束时的变量值。