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

4次阅读

共计 1086 个字符,预计需要花费 3 分钟才能阅读完成。

面试题

这是 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。

知乎:无忌。

正文完
 0