2022-4-21 实习Day19

1、新贸金账户行关联表信息配置 –3小时 80%
2、新贸金系统汇出汇款业务手动测试。–3小时 80%

Golang编程学习(part 15)

1、函数的defer

在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后及时的释放资源,Go的设计者提供defer(延时机制)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

func sum(n1 int, n2 int) int {
// 当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈)
// 当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行
defer fmt.Println("ok1 n1=", n1) //3
defer fmt.Println("ok2 n2=", n2) //2

res := n1 + n2 // res = 30
fmt.Println("ok3 res=", res) //1
return res
}

func main() {
res := sum(10, 20)
fmt.Println("res=", res) //4
}

ok3 res= 30
ok2 n2= 20
ok1 n1= 10
res= 30

2、defer的注意事项和细节

① 当go执行到一个defer时,不会立即执行defer后的语句,而是将defer后面的语句压入到一个栈中,然后继续执行函数下一个语句
② 当函数执行完毕后,再从defer栈中依次从栈顶取出语句执行(注:遵循先入后出的机制)
③ 在defer将语句放入到栈时,也会将相关的值拷贝同时入栈
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import "fmt"

func sum(n1 int, n2 int) int {

defer fmt.Println("ok1 n1=", n1)
defer fmt.Println("ok2 n2=", n2)

n1++
n2++

res := n1 + n2
fmt.Println("ok3 res=", res)
return res
}

func main() {
res := sum(10, 20)
fmt.Println("res=", res)
}

ok3 res= 32
ok2 n2= 20
ok1 n1= 10
res = 32

3、defer的最佳实践

defer最主要的价值是在,当函数执行完毕后,可以及时的释放函数创建发资源

image-20220430141446184

① 在golang编程中通常做法是,创建资源后,比如(打开了文件,获取了数据库连接,或者是锁资源),可以执行 defer file.Close() defer connect.Close()
② 在defer后,可以继续使用创建资源
③ 当函数完毕后,系统会依次从defer栈中,取出语句,关闭资源
④ 这种机制,非常简洁,程序员不用再为在什么时机关闭资源而烦心