关于golang:Go-Quiz-从Go面试题看panic注意事项第1篇

面试题

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

// quiz0.go
package main

import "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.go
package main

import "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。

知乎:无忌。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理