闭包 / Defer / Error
闭包
介绍
基本介绍: 闭包就是一个函数和与其相关的引用环境组成的一个整体(实体)
案例演示
1 | // 闭包的测试 |
说明
- AddUpper() 是一个函数,返回的数据类型是 func(int) int .
- 闭包的说明: 返回的是一个函数,入演示中的匿名函数,但是这个匿名函数引用到了函数外的资源 n , 因此,匿名函数和 n 形成一个整体,从而构成一个闭包。
- 可以这么理解: 闭包是一个类,这个函数是方法, n 是变量。
- 当我们反复调用 addUpper 时,n 是初始化一次,构成了累加。
- 闭包的关键在于 返回的函数引用到了哪些变量?
Defer的理解
介绍
在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等) ,为了在 函数执行完毕后,及时的释放资源,Go 的设计者提供 defer (延时机制)。
案例演示
1 | func Sum(x , y int) int{ |
执行的结果如下:
1 | res = 30 |
Defer的价值 当函数执行完毕后,可以及时的释放函数创建的资源
GO 中的错误的处理方式
演示案例
1 | func ErrorTest(){ |
执行的结果如下:
1
2
3
4
5
6
7panic: runtime error: integer divide by zero
goroutine 1 [running]:
go-learn/src/function.ErrorTest()
D:/Projects/GoProjects/go-learn/src/function/error.go:13 +0x11
main.main()
D:/Projects/GoProjects/go-learn/main.go:11 +0x27
对于异常,的处理方案如下:
- 使用 defer + recover 来捕获异常并处理
1
2
3
4
5
6
7
8
9
10
11
12func ErrorTest(){
defer func() {
err := recover()
if err != nil {
fmt.Println("err = " , err)
}
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println(res)
}
自定义错误
Go 中,可以对错误进行自定义,一般使用 errors.New(“”) / panic(“”
)