面试题答案
一键面试-
defer语句执行顺序及最终返回值分析:
- 在Go语言中,
defer
语句会在函数结束时按照后进先出(LIFO,Last In First Out)的顺序执行。 - 首先,
complexFunction
函数开始执行,num
初始值为10。 - 执行
num = num + 3
,此时num
的值变为13。 - 然后函数准备返回,开始执行
defer
语句。先执行最后一个defer
语句,即num = num - 5
,此时num
的值变为13 - 5 = 8。 - 接着执行第一个
defer
语句,num = num * 2
,此时num
的值变为8 * 2 = 16。 - 所以最终返回值是16。
- 在Go语言中,
-
将defer语句中的操作换成调用其他会修改num值的函数的影响:
- 如果将
defer
语句中的操作换成调用其他会修改num
值的函数,其执行逻辑不变,依然按照后进先出的顺序执行。 - 例如,假设有两个函数
modify1
和modify2
,它们会修改num
的值:
- 如果将
package main
import (
"fmt"
)
func modify1(num *int) {
*num = *num - 5
}
func modify2(num *int) {
*num = *num * 2
}
func main() {
result := complexFunction()
fmt.Println(result)
}
func complexFunction() int {
var num = 10
defer modify2(&num)
defer modify1(&num)
num = num + 3
return num
}
- 这里
modify1
和modify2
函数通过指针来修改num
的值。在函数返回时,依然先执行modify1
,再执行modify2
,最终结果还是16。但要注意,如果修改num
值的函数逻辑复杂,可能会引入一些意想不到的错误,比如竞争条件(如果在多线程环境下使用num
并且函数内部有并发操作)等问题。总之,只要遵循defer
语句后进先出的执行顺序,无论换成何种修改num
值的函数,结果的计算逻辑都是一样的。