0%

go语言基础7--defer相关

1. 多个defer语句,按先进后出的方式执行

package main 
import "fmt" 
func main() {    
    var whatever [5]struct{s}    
    for i := range whatever {
        defer fmt.Println(i)    
    } 
}

//4
//3
//2
//1
//0

2. 易错点:defer加func函数带return

package main 
import "fmt" 
//测试函数带参数  直接返回函数参数x再调用defer
func test1(x int) int {
	defer func() { x = 9 }()
	return x
}
//测试函数带参数 先赋值x 然后回回函数参数x再调用defer
func test11(x int) int {
	defer func() { x = 9 }()
	x = 10
	return x
}
//测试函数返回值带参数 先赋值x 然后回回函数参数x再调用defer 但是defer内参数x与返回值参数名相同 直接覆盖原返回值 
//结尾return x 是诱导 可以不用写返回值
func test2() (x int) {
	defer func() { x = 9 }()
	x = 10
	return x
    //return 
}
//测试函数返回值带参数 同上 覆盖并调用defer得 返回值为10
func test3() (x int) {
	defer func() { x = 10 }()
	defer func() { x = 9 }()
	return x
}

func main() {    
    fmt.Println(test1(1))  //1
    fmt.Println(test11(1)) //10
    fmt.Println(test2())   //9
    fmt.Println(test3())   //10
}

总结: 执行逻辑

测试函数->非defer测试函数内局部变量赋值->return 变量 ->defer函数(如果测试函数有返回值函数且内部变量与返回值参数同名,覆盖return变量值)

更多defer用法参考: Go 延迟调用 defer 用法详解 - 腾讯云开发者社区-腾讯云 (tencent.com)

-------------本文结束感谢您的阅读-------------
打赏一瓶矿泉水