Ezreal 书架 Ezreal 书架
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
  • 逃逸分析

  • 延迟语句

    • 延迟语句是什么
    • 延迟语句的执行顺序是什么
    • 如何拆解延迟语句
    • 如何确定延迟语句的参数
    • 闭包是什么
    • 延迟语句如何配合恢复语句
    • defer 链如何被遍历执行
    • 为什么无法从父 goroutine 恢复子 goroutine 的 panic
  • 数据容器

  • 通道

  • 接口

  • unsafe

  • context

  • Go程序员面试笔试宝典
  • 延迟语句
ezreal_rao
2023-04-27

如何确定延迟语句的参数

defer 语句表达式的值在定义时就已经确定了。下面通过三个不同的函数来理解:

func t1() {
	var err error
	defer fmt.Println(err)
	err = errors.New("defer1 error")
	return
}

func t2() {
	var err error
	defer func() {
		fmt.Println(err)
	}()
	err = errors.New("defer2 error")
	return
}

func t3() {
	var err error
	defer func(err error) {
		fmt.Println(err)
	}(err)
	err = errors.New("defer3 error")
	return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

运行结果:

<nil>
defer2 error
<nil>
1
2
3

第 1 和第 3 个函数中,因为作为参数,err 在函数定义的时候就会求值,并且定义的时候 err 的值都是 nil,所以最后打印的结果都是 nil;第 2 个函数的参数其实也会在定义的时候求值,但第 2 个例子中是一个闭包,它引用的变量 err 在执行的时候值最终变成 defer2 error 了。

现实中第 3 个函数比较容易犯错误,在生产环境中,很容易写出这样的错误代码,导致最后 defer 语句没有起到作用,造成一些线上事故,要特别注意。

#延迟语句#defer
上次更新: 5/9/2023, 10:58:32 AM
如何拆解延迟语句
闭包是什么

← 如何拆解延迟语句 闭包是什么→

最近更新
01
为什么我的MySQL会抖一下
07-15
02
HTTP 性能优化面面观
07-12
03
WebSocket:沙盒里的 TCP
07-12
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Ezreal Rao | CC BY-NC-SA 4.0
豫ICP备2023001810号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式