面试题

这是Go Quiz系列里对于panic的第1篇,次要考查同一个goroutine在屡次panic场景下recover的机制。

// quiz0.gopackage mainimport "fmt"func main() {    defer func() { fmt.Println(recover()) }()    defer func() { fmt.Println(recover()) }()    defer panic(1)    panic(2)}
  • A: 2 <nil>
  • B: 1 <nil>
  • C: 2 1
  • D: 1 2
  • E: 间接panic

解析

defer的函数调用会被延后到函数return或者panic退出之前执行,因而本题的执行后果如下:

Step 1: 执行panic(2),触发被defer的函数的执行

Step 2: 执行代码里第9行被defer的函数调用panic(1)panic(1)会笼罩panic(2),能够当做panic(2)没有了

Step 3: 执行代码里第8行被defer的函数调用,recover()捕捉panic(1),打印1

Step 4: 执行代码里第7行被defer的函数调用,recover()返回的是nil,因为panic曾经被第8行的recover()捕捉,所以打印nil

所以本题的答案是B

思考题

留一道思考题,想晓得答案的能够给自己vx公众号发送音讯panic获取答案和题目解析。

// quiz1.gopackage mainimport "fmt"func main() {    defer func() { fmt.Println(recover()) }()    defer panic(1)    panic(2)}
  • A: 1
  • B: 2
  • C: 先打印1,而后panic
  • D: 先打印2,而后panic

加餐

  • Go Quiz: Google工程师的Go语言面试题
  • Go Quiz: 从Go面试题看slice的底层原理和注意事项
  • Go Quiz: 从Go面试题搞懂slice range遍历的坑
  • Go Quiz: 从Go面试题看channel的注意事项
  • Go Quiz: 从Go面试题看channel在select场景下的注意事项
  • Go Quiz: 从Go面试题看defer语义的底层原理和注意事项
  • Go Quiz: 从Go面试题看defer的注意事项第2篇
  • Go Quiz: 从Go面试题看defer的注意事项第3篇
  • Go Quiz: 从Go面试题看分号规定和switch的注意事项
  • 官网教程:Go泛型入门
  • 一文读懂Go泛型设计和应用场景

开源地址

文章和示例代码开源在GitHub: Go语言高级、中级和高级教程。

公众号:coding进阶。关注公众号能够获取最新Go面试题和技术栈。

集体网站:Jincheng's Blog。

知乎:无忌。