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

闭包是什么

闭包是由函数及其相关引用环境组合而成的实体,即:闭包 = 函数 + 引用环境。 一般的函数都有函数名,而匿名函数没有。匿名函数不能独立存在,但可以直接调用或者赋值 于某个变量。匿名函数也被称为闭包,一个闭包继承了函数声明时的作用域。在 Go 语言中,所有 的匿名函数都是闭包。

有个不太恰当的例子:可以把闭包看成是一个类,一个闭包函数调用就是实例化一个类。闭包在运 行时可以有多个实例,它会将同一个作用域里的变量和常量捕获下来,无论闭包在什么地方被调用(实 例化)时,都可以使用这些变量和常量。而且,闭包捕获的变量和常量是引用传递,不是值传递。

举个简单的例子:

func main() {
	var a = Accumulator()
	fmt.Printf("%d\n", a(1))
	fmt.Printf("%d\n", a(10))
	fmt.Printf("%d\n", a(100))

	fmt.Println("------------------------")

	var b = Accumulator()
	fmt.Printf("%d\n", b(1))
	fmt.Printf("%d\n", b(10))
	fmt.Printf("%d\n", b(100))
}

func Accumulator() func(int) int {
	var x int
	return func(i int) int {
		fmt.Printf("%+v, %+v-", &x, x)
		x += i
		return x
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

执行结果是:

0xc0000140f0, 0-1
0xc0000140f0, 1-11
0xc0000140f0, 11-111
------------------------
0xc0000140f8, 0-1
0xc0000140f8, 1-11
0xc0000140f8, 11-111
1
2
3
4
5
6
7

闭包引用了 x 变量,a,b 可看作 2 个不同的实例,实例之间互不影响。实例内部,x 变量 是同一个地址,因此具有 “累加效应”。

#延迟语句#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号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式