MST

星途 面试题库

面试题:Go语言defer执行顺序在复杂场景下的分析

假设在Go语言中,有如下复杂的函数结构: ```go package main import ( "fmt" ) func main() { result := complexFunction() fmt.Println(result) } func complexFunction() int { var num = 10 defer func() { num = num * 2 }() defer func() { num = num - 5 }() num = num + 3 return num } ``` 请详细分析在`complexFunction`函数执行过程中,defer语句的执行顺序以及最终返回值是如何得到的,并阐述如果将defer语句中的操作换成调用其他会修改`num`值的函数,会对结果产生怎样的影响。
32.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 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。
  2. 将defer语句中的操作换成调用其他会修改num值的函数的影响

    • 如果将defer语句中的操作换成调用其他会修改num值的函数,其执行逻辑不变,依然按照后进先出的顺序执行。
    • 例如,假设有两个函数modify1modify2,它们会修改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
}
  • 这里modify1modify2函数通过指针来修改num的值。在函数返回时,依然先执行modify1,再执行modify2,最终结果还是16。但要注意,如果修改num值的函数逻辑复杂,可能会引入一些意想不到的错误,比如竞争条件(如果在多线程环境下使用num并且函数内部有并发操作)等问题。总之,只要遵循defer语句后进先出的执行顺序,无论换成何种修改num值的函数,结果的计算逻辑都是一样的。