小程序开发定制【go】defer的使用

卸载前面

第一次看go小程序开发定制基础语法的时候,小程序开发定制用使用到了defer。小程序开发定制但是一直不知道它到底是什么,小程序开发定制有什么用途。这几天通过查询、学习。算是对defer有了一点浅显的认识。

1.什么是defer

defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,通常用于释放资源。

2.defer的特点

defer遵循先进后出的原则,类似于栈的结构。

补充下:为什么要把defer设计成这种机制?

因为后申请的资源和可能对前面申请的资源有依赖。如果先将前面申请的资源释放掉了。对于后面的资源可能会造成影响。所以先释放后申请的资源,再释放前面申请的资源。

3.defer什么时间执行

前面说到,defer只有在当前函数执行完毕后,才会执行。其实不太准确。
go中的return语句并不是原子性操作,一般是分为两步:

  1. 将返回值赋值给一个变量
  2. 执行RET指令。

defer就执行在1之后,2之前。

4.defer常见的坑

1.输出是多少?

	x := 10	defer func(a int) {		fmt.Println(a)	}(x)	x++
  • 1
  • 2
  • 3
  • 4
  • 5

答案:

为什么?
因为defer后面的函数在入栈的时候保存的是入栈那一刻的值,而当时x的值是10,所以后期对x修改,并不会影响栈内函数的值。

2.输出多少

	x := 10	defer func(a *int) {		fmt.Println(*a)	}(&x)	x++
  • 1
  • 2
  • 3
  • 4
  • 5

答案:

为什么?
这里defer后面函数入栈的时候存入的执行变量x的指针。所以,后期x值改变的时候,输出结果也会改变。

3.输出多少

func test()(x int)  {	 x = 10	 defer func() {	 	x++	 }()	 return x}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

答案:

为什么?
之前我们说过,return并不是原子性操作,是通过一个变量赋值和ret指令来完成的。
而上述例子中,是具名函数。即返回值带有名字。这样我们在执行defer的时候相当于修改了返回值的值。所以为11

看到这里,博主想到了闭包。和闭包有没有关系呢?

4.输出什么

func test1() int {	x := 10	defer func() {		x++	}()	// ans = x	// -------- defer x = x+1	// return x	return x}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

答案:

为什么?
还是return语句的原因,博主已经在代码中给出提示。可见,非具名函数不会受到相应的影响。

对于defer暂时理解了这些,下次再见。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发