更新时间:
#golang defer 小知识
defer return 先执行return 再执行defer
func DeferFunc1(i int) (t int) { //
t = i // 这里直接用变量t
defer func() {
t += 3
}()
return t
}
1. 将返回值t赋值为传入的i,此时t为1
2. 执行return语句将t赋值给t(等于啥也没做)
3. 执行defer方法,将t + 3 = 4
4. 函数返回 4
因为t的作用域为整个函数所以修改有效。
----
func DeferFunc2(i int) int { // 函数返回返回值1
t := i // 这里定义
defer func() {
t += 3
}()
return t
}
1. 创建变量t并赋值为1
2. 执行return语句,注意这里是将t赋值给返回值,此时返回值为1(这个返回值并不是t)
3. 执行defer方法,将t + 3 = 4
4. 函数返回返回值1
func DeferFunc3(i int) (t int) {
defer func() {
t += i
}()
return 2
}
1. 首先执行return将返回值t赋值为2
2. 执行defer方法将t + 1
3. 最后返回 3
func DeferFunc4() (t int) {
defer func(i int) {
fmt.Println(i)
fmt.Println(t)
}(t)
t = 1
return 2
}
1. 初始化返回值t为零值 0
2. 首先执行defer的第一步,赋值defer中的func入参t为0
3. 执行defer的第二步,将defer压栈
4. 将t赋值为1
5. 执行return语句,将返回值t赋值为2
6. 执行defer的第三步,出栈并执行
因为在入栈时defer执行的func的入参已经赋值了,此时它作为的是一个形式参数,所以打印为0;相对应的因为最后已经将t的值修改为2,所以再打印一个2
#评论
#评论 1 · 2023-04-10T02:07:43.968000Z
实际项目,没人写这东西。找开呢