site logo

Keep doing what you want, never give up.

招聘会
文章配图

大厂面试 - 腾讯:Go中defer语句的作用及其执行顺序

在Go中,defer语句用于延迟函数的执行,通常用于在函数运行结束前执行一些清理工作。 一个函数中可以存在多个defer语句,当函数中存在多个defer语句时,它们的执行顺序是后进先出,即函数中最后一个defer语句会被最先执行,第一个defer语句则会最后才执行。 在Go中,defer语句中的“代码片段”会按它们在函数中出现的顺序先后被压入一个栈中,当函数执行结束时(return之前),这些被压入栈的“代码片段”会按照后进先出的顺序逐一被执行。
文章配图

面试官:main函数的输出结果是什么,为什么?

以下main函数的输出结果是什么? func main() { runtime.GOMAXPROCS(1) var wg sync.WaitGroup wg.Add(3) go func(n int) { println(n) wg.Done() }(1) go func(n int) { println(n) wg.Done() }(2) go func(n int) { println(n) wg.Done() }(3) wg.Wait() } 答案:312 解析:任务队列的优先级有三种 - P.runnext、P.runq以及全局的Schedt.runq,schedule调度时除了每隔一段就尝试从全局队列中去获取g外,还会尝试从本地队列中获取g,P.runnext的优先级更高,然后是队列的头部取。