Golang defer 中变量的赋值,return了也给你改了

Golang defer 中变量的赋值,return了也给你改了

Golang轻松学习


一、defer 是什么?

在Golang当中,defer代码块会在函数调用链表中增加一个函数调用,会在return之后添加一个函数调用。因此,defer通常用来释放函数内部变量。也可以在代码中优雅的关闭/清理代码中所使用的变量,关闭连接池与错误的捕获。

二、变量的赋值

1.直接声明变量会立刻解析

defer fmt.Println(“fmt a1:”,a)

代码如下(示例):

func main() {
    
    

	a := 1
	defer fmt.Println("fmt  a1:",a)
	a++
}

结果

在这里插入图片描述

2.声明方法,但不影响方法内变量

defer func() {
fmt.Println(“func a2:”,a)
}()

代码如下(示例):

func main() {
    
    

	a := 1
	defer func() {
    
    
		fmt.Println("func a2:",a)
	}()
	a++

}


结果

在这里插入图片描述

三、变量的赋值顺序

1.后进先出规则

代码如下(示例):

func main() {
    
    

	a := 1
	defer fmt.Println("fmt  a1:",a)
	defer func() {
    
    
		fmt.Println("func a2:",a)
		a++
	}()
	defer func() {
    
    
		fmt.Println("func a3:",a)
		a++
	}()
	a++
}

结果

在这里插入图片描述

2.声明方法后,变量可变;直接声明变量不可变

代码如下(示例):

func main() {
    
    
	a := 1
	defer fmt.Println("fmt  a1:",a)
	defer func() {
    
    
		fmt.Println("func a2:",a)
		a++
	}()
	defer func() {
    
    
		fmt.Println("func a3:",a)
		a++
	}()
	a++
}



结果

此时依次声明,
a1 值直接声明变量不可变为1
a2 直接声明方法,a2值随着a值改变
a3 直接声明方法,a3值随着a值改变

方法在 a ++ 后结束,此时a为 2
a3 由于直接声明方法,a3值随着a值改变,此时a值为 2,
再执行a3内 a++,此时a为 3
a2 由于直接声明方法,a2值随着a值改变,此时a值为 3,
再执行a3内 a++,此时a为 4
a1 由于直接声明,a1值不可变,依旧为1
在这里插入图片描述

四、return 后 修改返回值

1.原方法

代码如下(示例):

func main() {
    
    

	a := 1

	i := ANum(a)

	fmt.Println("i", i)

}

func ANum(a int) (i int) {
    
    
	fmt.Println("a", a)
	return a
}

结果

在这里插入图片描述

2.修改返回值

代码如下(示例):

func main() {
    
    

	a := 1

	i := ANum(a)

	fmt.Println("i", i)

}

func ANum(a int) (i int) {
    
    

	defer func() {
    
    
		i = 100
	}()

	fmt.Println("a", a)
	return a
}

结果

此时返回值已被修改为 100
在这里插入图片描述


总结

通过以上来了解Golang中defer 的使用, 在Go语言中,可以使用关键字defer向函数注册退出调用,即主函数退出时,defer后的函数才被调用。defer语句的作用是不管程序是否出现异常,均在函数退出时自动执行相关代码。
在函数中,经常需要创建资源(比如:数据库连接、文件句柄、锁等) ,通过defer在函数执行完毕后执行,及时的释放资源。

希望这个博客能对你有所益处。我是轻王,我为自己代言。

猜你喜欢

转载自blog.csdn.net/moer0/article/details/123594085