interview
go-basics
Go 语言中 defer 的执行顺序是什么

Go 基础面试题, Go 语言中 defer 的执行顺序是什么?

Go 基础面试题, Go 语言中 defer 的执行顺序是什么?

QA

Step 1

Q:: Go 语言中 defer 的执行顺序是什么?

A:: 在 Go 语言中,defer 语句会将函数调用推迟到包含 defer 的函数执行完毕后才执行。defer 调用是按照先进后出的顺序执行的(LIFO),也就是说,最后一个 defer 的语句会最先执行,而第一个 defer 的语句会最后执行。这一特性在资源清理、文件关闭、锁的释放等场景中非常有用。

Step 2

Q:: defer 语句的使用场景有哪些?

A:: defer 语句主要用于确保特定的清理操作(如关闭文件、释放锁、清理内存等)在函数结束时执行,而不论函数是正常返回还是由于 panic 终止。它通常用于资源管理、异常处理和日志记录中。例如,打开文件后可以使用 defer 语句确保文件关闭,即使中途出现错误也不会遗漏。

Step 3

Q:: defer 与 return 的执行顺序是怎样的?

A:: 在 Go 语言中,当函数执行到 return 语句时,首先计算返回值,但函数并不会立即返回,而是会执行所有的 defer 语句,然后才返回调用者。也就是说,defer 的执行发生在 return 语句计算之后,函数真正返回之前。

Step 4

Q:: 在 defer 中修改返回值是否可行?

A:: 可以。由于 defer 语句在 return 语句之后执行,因此可以在 defer 中修改命名返回值(named return values)。通过修改这些返回值,可以在函数退出之前更改返回的结果。需要注意的是,修改无命名返回值则无法生效。

用途

defer 语句是 Go 语言中用于资源管理和异常处理的一个关键特性。在实际生产环境中,defer 语句常用于确保资源(如文件、数据库连接等)在使用完毕后正确关闭。这可以防止资源泄漏问题,并确保代码的健壮性和可维护性。此外,defer 在处理 panic 时也非常有用,它允许在异常发生时进行资源清理、日志记录等操作,确保系统的稳定性和可靠性。\n

相关问题

🦆
Go 语言中的 panic 和 recover 是什么?

panic 是 Go 中处理异常的机制,用于主动触发错误,导致程序中断。recover 是一个内建函数,可以在 defer 语句中调用,用来捕获 panic 并阻止程序崩溃。它们常用于处理无法预见的错误场景,使程序能够在某些异常情况下继续执行或优雅地终止。

🦆
Go 语言中的 error 接口有什么作用?

error 是 Go 中用于错误处理的标准接口。它有一个方法 Error() string,用于返回描述错误的字符串。通过实现 error 接口,可以定义自定义错误类型,并在函数或方法中返回错误信息,帮助调用者处理异常情况。error 接口是 Go 语言中处理运行时错误的重要机制。

🦆
在 Go 中如何正确关闭 Goroutine?

正确关闭 Goroutine 需要通过 channel 来进行信号传递,通常使用一个 done channel 来通知 Goroutine 停止执行。避免 Goroutine 泄漏(goroutine leak)是并发编程中非常重要的一点。利用 context 包可以更优雅地管理 Goroutine 的生命周期,例如通过 context.WithCancel 来实现取消信号的传递。

🦆
Go 语言中的 Mutex 是什么?

Mutex 是 Go 标准库 sync 包中提供的互斥锁,用于保护共享资源在多 Goroutine 访问时不发生竞争条件。通过 Lock 和 Unlock 方法,Mutex 确保同一时间只有一个 Goroutine 能够访问临界区代码,避免数据竞争问题。

🦆
Go 中的 select 语句有什么作用?

select 语句用于在多个 channel 操作中选择一个执行。它可以同时监听多个 channel,当其中一个 channel 准备好时,select 语句会执行对应的 case 分支。select 语句使得在 Go 中处理异步 IO 和并发任务更加灵活,是实现非阻塞通信的关键。