Go 语言defer的使用以及注意事项

首先在学习defer之前要先了解Go语言的return是怎么操作的。
return:分为两个步骤,1、首先执行的将需要返回的数据进行赋值,
2、然后才是真正的返回数据
defer:延迟执行,后面必须跟一个函数调用语句(expression in defer must be function call),否则报错:
syntax error: unexpected ++ at end of statement。
defer的执行步骤在return语句的1和2之间
在这里插入图片描述

package main

import "fmt"

// fun的执行顺序是1, 2, 3
func fun(){
	fmt.Println(1)
	defer func(){
		fmt.Println(3)
	}()
	fmt.Println(2)
}

// 首先将返回值赋值,此时返回值y=3,再执行defer后面的语句,而defer中的y是函数参数中的y值,这并不会改变返回的y值,所以最后还是3
func fun1(y int) int {
	y += 2
	defer func() {
		y++
	}()
	return y // 3
}

// 首先将返回值赋值,此时返回值y=3,再执行defer后面的语句,而defer中的y是函数返回值中的y值,对其操作会影响返回值,所以最后返回4
func fun2() (y int) {
	y = 3
	defer func() {
		y++
	}()
	return y // 4
}

func fun3() int {
	y := 5
	defer func() {
		y++
	}()
	return 4  // 4
}

func fun4() (y int) {
	defer func() {
		y++
	}()
	return 4 // 5
}

func main() {
	fun()
	
	fmt.Println(fun1(1))
	fmt.Println(fun2())
	fmt.Println(fun3())
	fmt.Println(fun4())

}

总结: 对于defer的使用,需要注意的是你defer后面操作的对象是函数的参数还是返回值,如果是参数,就没什么影响,如果是返回值,那就有影响。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页