defer的主要使用场景:在函数执行完毕后,释放资源
看一段代码
package main
import "fmt"
func sum(a, b int) int {
defer fmt.Println("a=", a)
defer fmt.Println("b=", b)
a++
b++
c := a + b
fmt.Println("c=", c)
return c
}
func main() {
result := sum(1, 2)
fmt.Println("result=", result)
}
//输出:
// c= 5
// b= 2
// a= 1
// result= 5
1.可以看到最后用defer声明的语句先执行,这是因为go将defer后的语句压入栈中,因为遵循后进先出的原则
2.程序输出a=1,b=2,它们的值并没有自增,说明入栈时,相应的值(a、b)也同时入栈,后面的自增不会影响defer后的语句