go语言---defer

go语言的defer
  1. go语言中defer可以完成延迟功能,当前函数执行完成后再执行defer的代码块;
  2. defer常用于关闭文件,关闭数据库等;
  3. 代码中如果有defer, 代码就可能不是按照顺序执行的,即使defer写在最前面,也可能会最后执行;("可能"用于多个defer的情况)
  4. 多重defer采用栈结构执行,即先进后出,先产生的defer后执行;
  5. defer与return连用时,要把return理解成2条执行结合(不是原子指令),一个指令是给返回值赋值,另一个指令是返回跳出函数;
  6. defer和return整体执行顺序: 1.先给返回值赋值–>2.执行defer–>3.返回跳出函数,如果没有定义返回值接收变量,执行defer时返回已有赋值;
  7. 如果代码中有os.Exit(),则程序会提前结束,且defer不会被执行到;

package main

import (
	"fmt"
	"os"
)

func main() {

	testDefer1()
	fmt.Println("testDefer2: ", testDefer2()) // 0
	fmt.Println("testDefer3: ", testDefer3()) // 2


	fmt.Println("testDefer5: ", testDefer5()) //
	fmt.Println("testDefer6: ", testDefer6()) //

	testDefer4()
}

func testDefer1() {
	// 测试defer

	fmt.Println("打开A")
	defer func() {
		fmt.Println("关闭A")
	}()

	fmt.Println("打开B")
	defer func() {
		fmt.Println("关闭B")
	}()

	fmt.Println("打开C")
	defer func() {
		fmt.Println("关闭C")
	}()

	fmt.Println("打开D")
	defer func() {
		fmt.Println("关闭D")
	}()

	/*
		执行结果:
		打开A
		打开B
		打开C
		打开D
		关闭D
		关闭C
		关闭B
		关闭A
	*/
}

// defer 与 return 连用, 没有定义返回值变量的情况
// defer和return整体执行顺序: 1.先给返回值赋值-->2.执行defer-->返回跳出函数,如果没有定义返回值接收变量,执行defer时返回已有赋值;
func testDefer2() int {
	i := 0
	defer func() {
		i += 2
	}()
	return i // 返回值是0
}

// 测试定义了返回值变量的情况
func testDefer3() (i int) {
	i = 0
	defer func() {
		i += 2
	}()
	return i // 返回值是2,两个函数的区别是:是否定义了返回值变量
}


// 测试defer遇到os.Exit()的情况
func testDefer4() {
	fmt.Println("打开A")
	defer func() {
		fmt.Println("关闭A")
	}()

	fmt.Println("打开B")
	defer func() {
		fmt.Println("关闭B")
	}()

	fmt.Println("打开C")
	defer func() {
		fmt.Println("关闭C")
	}()

	// 直接调用os.Exit(0)退出程序, defer都不会执行了
	os.Exit(0)
}


func testDefer5() int{
	i := 0
	defer func() {
		n := i + 1
		fmt.Println("n的值是: ", n)
	}()
	//return n // 这里可以通过IDE知道,此时n是不存在的,且提示defer里面的n没有被使用;
	//return 1 // 如果将这里的返回值改为固定值,就会出现defer里面的n定义了没有使用;由此可知执行顺序是先执行return里面的赋值,再执行defer语句,最后结束函数;
	return 1
}

// 测试定义了返回值变量的情况
func testDefer6() (n int) {
	i := 0
	defer func() {
		n = i + 1
	}()
	return n  // 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值