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

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

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

QA

Step 1

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

A:: 在 Go 语言中,defer 语句用于延迟一个函数的执行,直到包含该 defer 的函数执行完毕。defer 一般用于资源清理操作,例如关闭文件、释放锁等。多个 defer 语句按 LIFO(后进先出)顺序执行。例如:

 
package main
import "fmt"
func main() {
    defer fmt.Println("World")
    fmt.Println("Hello")
}
 

输出: Hello World

Step 2

Q:: defer 语句的执行顺序是怎样的?

A:: defer 语句的执行顺序是按照后进先出的顺序执行。也就是说,后声明的 defer 语句会先执行。多个 defer 语句可以叠加使用,执行时它们会以逆序执行。例如:

 
package main
import "fmt"
func main() {
    defer fmt.Println("First")
    defer fmt.Println("Second")
    defer fmt.Println("Third")
}
 

输出: Third Second First

Step 3

Q:: defer 语句在函数返回值的场景下如何表现?

A:: defer 语句在函数返回值的场景中,会在 return 语句执行后再执行,并且可以通过修改具名返回值来影响最终的返回结果。例如:

 
package main
import "fmt"
func example() (result int) {
    defer func() {
        result++
    }()
    return 0
}
func main() {
    fmt.Println(example())
}
 

输出: 1

用途

defer 语句在生产环境中非常重要,特别是在处理资源管理、文件操作、网络连接等场景中。通过使用 defer,可以确保无论函数如何退出,资源总会被正确释放。这在防止资源泄漏、确保系统稳定性和可靠性方面起到关键作用。此外,defer 语句的正确使用可以提高代码的可读性和维护性,因此在面试中考察这个知识点非常重要。\n

相关问题

🦆
Go 语言中的错误处理机制是什么?

Go 语言采用显式的错误处理机制。通过返回 error 类型值来标识函数是否成功执行,调用方需要检查这个返回值并处理可能的错误。例如:

 
package main
import (
    "errors"
    "fmt"
)
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}
func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}
 
🦆
Go 中的 Goroutine 和 Channel 是什么?

Goroutine 是 Go 中轻量级的线程,用于并发执行任务。通过 go 关键字启动 Goroutine。Channel 是 Goroutine 之间通信的管道,可以安全地在 Goroutine 之间传递数据。它们在构建并发程序时非常重要。

 
package main
import "fmt"
func sum(a, b int, result chan int) {
    result <- a + b
}
func main() {
    result := make(chan int)
    go sum(3, 4, result)
    fmt.Println(<-result)
}
 
🦆
Go 语言中的 panic 和 recover 机制是什么?

panic 和 recover 是 Go 语言中处理异常情况的机制。panic 用于在程序出现严重错误时中断程序执行,而 recover 则可以捕获 panic 使程序恢复执行。它们主要用于处理不可预见的严重错误,但应避免在常规错误处理中使用。

 
package main
import "fmt"
func safeDivide(a, b int) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from", r)
        }
    }()
    fmt.Println(a / b)
}
func main() {
    safeDivide(4, 2)
    safeDivide(4, 0)
}
 

输出: 2 Recovered from runtime error: integer divide by zero