interview
go-basics
Go语言中如何使用defer语句?

Go基础面试题, Go 语言中如何使用 defer 语句?

Go基础面试题, Go 语言中如何使用 defer 语句?

QA

Step 1

Q:: Go 语言中如何使用 defer 语句?

A:: 在 Go 语言中,defer 语句用于在函数返回之前执行一段代码。通常用于资源释放(如关闭文件、解锁互斥量等)。defer 语句后面的函数调用会被延迟到包含它的函数即将返回时执行,且执行顺序为 LIFO(后进先出)。使用 defer 可以确保在函数执行过程中出现错误或提前返回时,仍然能够正确释放资源。

示例:

 
func example() {
    file, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close() // 在函数返回前关闭文件
 
    // 进行文件操作
}
 

用途

面试 `defer` 语句的主要原因是为了评估候选人对资源管理的理解,尤其是在异常处理和函数提前返回的情况下,是否能够确保资源得到正确释放。在实际生产环境中,这个知识点对于编写健壮、易于维护的代码至关重要。例如,处理文件、网络连接、数据库连接等资源时,使用 `defer` 可以确保资源在不使用时被及时释放,避免资源泄漏问题。\n

相关问题

🦆
Go 语言中 defer 的执行顺序是怎样的?

defer 语句的执行顺序是 LIFO(后进先出)。也就是说,多个 defer 语句会按照它们被定义的相反顺序执行。

示例:

 
func example() {
    defer fmt.Println("first")
    defer fmt.Println("second")
    defer fmt.Println("third")
}
// 输出顺序:third -> second -> first
 
🦆
在 Go 语言中,defer 如何处理带有参数的函数调用?

defer 声明时,延迟执行的函数的参数会立即计算,但函数本身会在函数返回时才执行。这意味着即使延迟的函数在之后发生了变量变化,它的参数值仍然是声明时的值。

示例:

 
func example() {
    x := 10
    defer fmt.Println(x) // x 的值在这里被计算为 10
    x = 20
    fmt.Println("x value before return:", x) // 打印 20
}
// defer 打印 10 而不是 20
 
🦆
在什么情况下 defer 可能会导致性能问题?

defer 在高性能要求的场景中,尤其是在频繁调用的小函数内使用时,可能会引入一些额外的开销,因为 Go 需要维护一个栈来跟踪所有的 defer 调用。在极端性能优化场景下,需要仔细评估 defer 的使用是否会影响程序的性能。