网站首页 返回列表 像“草根”一样,紧贴着地面,低调的存在,冬去春来,枯荣无恙。

golang面试基础系列-defer(一)

2020-06-10 02:44:00 admin 1052

go语言的语法学起来还是比较快的,但在实战过程中总会遇到这样或那样的错误,逐个解决领悟之后,才能真正掌握go语言的细枝末节,成为一名合格的gopher

废话不多说,先吃几个栗子:

  1. 下面的变量定义是否正确?

__

  1. var a int, b int, c int
  1. 下面的写法是否正确?

__

  1. package main
  2. s := "china"
  3. func main() {
  4. }
  1. 请写出打印值:

__

  1. s := make([]int, 5)
  2. s = append(s, 1, 2, 3)
  3. fmt.Println(s)

怎么样,是不是找到一丢丢感觉了呀 : )

===============================

今天第一节(儿童节也阔以愉快的写博客~),分享几点defer的细枝末节:

Defer规则一:下面的语句会触发panic吗?

__

  1. func main() {
  2. deferCall()
  3. }
  4. func deferCall() {
  5. defer func() {
  6. fmt.Println("打印前")
  7. /*if err := recover(); err != nil {
  8. fmt.Println(err)
  9. }*/
  10. }()
  11. defer func() { fmt.Println("打印中") }()
  12. defer func() { fmt.Println("打印后") }()
  13. panic("触发异常")
  14. }

【解析】当 deferpanic 处于同一个 goroutine 中,defer 会试图去recover(注释部分),此时由于没有
recover 进行捕获,因此会出现如下几种输出:

__

  1. a.
  2. “触发异常”
  3. “打印后”
  4. “打印中”
  5. “打印前”
  6. b.
  7. “打印后”
  8. “打印中”
  9. “打印前”
  10. “触发异常”
  11. c.
  12. “打印后”
  13. “触发异常”
  14. “打印中”
  15. “打印前”

出现以上几种不同的输出结果,笔者的理解(欢迎讨论~)是打印到 stdout
print函数在同一时刻争抢的结果,因为程序的实际执行顺序是:遇到panic,先执行 deferfmt.Println 后,再输出
panic 自己的报错。

Defer规则二:当defer被声明时,其参数就会被实时解析

__

  1. func calc(index string, a, b int) int {
  2. ret := a + b
  3. fmt.Println(index, a, b, ret)
  4. return ret
  5. }
  6. func main() {
  7. a := 1
  8. b := 2
  9. defer calc("1", a, calc("10", a, b))
  10. a = 0
  11. defer calc("2", a, calc("20", a, b))
  12. b = 1
  13. }

【解析】当 defer 被调用时,a, b 会取当前实时解析值,并先计算defer 里层 calc 的值保存下来,最后再执行defer 外层
calc函数,因此输出结果为:

__

  1. 10 1 2 3
  2. 20 0 2 2
  3. 2 0 2 2
  4. 1 1 3 4

Defer规则三:可以读取有名返回值

__

  1. package main
  2. import "fmt"
  3. func main() {
  4. v := c()
  5. fmt.Println(v)
  6. }
  7. func c() (i int) {
  8. defer func() { i++ }()
  9. return 1
  10. }

【解析】当 defer 返回时,获取到返回值 i = 1,进行 defer 里面的 i++,所以返回输出是2,而不是1。

以上就是今天分享的关于 defer 的几个point,这些硬知识看书很容易忽略,在实战中才能更好的掌握,keep moving~

稻草人生

转载文章,原文链接: golang面试基础系列-defer(一)

关键字词golangdefer

分享到:

如需留言,请 登录,没有账号?请 注册

0 条评论 0 人参与

顶部 底部