defer 在使用中有哪些需要注意的地方?
defer 在使用中有哪些需要注意的地方?
提示
题眼: 执行时机、执行顺序和参数求值时机
题解:常见追问一般是 defer 做什么、执行顺序是什么、遇到 panic 会怎样,以及 defer 调用的参数什么时候确定。
defer是延迟执行机制,会在当前函数即将返回时执行,无论是正常return还是发生panic。- 多个
defer按后进先出执行,也就是先定义的后执行,后定义的先执行。 defer后面函数调用的参数会在定义这条defer语句时就完成求值,而不是等真正执行时再计算。
重要
参考答案:defer 是 Go 里很常用的延迟执行机制。它会把一个函数调用延后到当前函数返回之前执行,这个返回既可能是正常返回,也可能是因为发生了 panic。
如果一个函数里写了多个 defer,它们的执行顺序是后进先出。比如你先后写了 defer 1、defer 2、defer 3,那真正执行时就是 3、2、1。
另外还有一个很容易考的点,就是 defer 的参数求值时机。defer 延迟的是函数调用本身,但参数会在写下这条语句的时候就先求值完成。
实际开发中,defer 很适合做资源回收,比如解锁、关闭文件、关闭连接;如果要处理 panic,也经常会和 recover 搭配使用。像互斥锁这种场景,常见写法就是先加锁,再立刻 defer unlock(),可以减少遗漏解锁的风险。
