go defer

defer

go语言中的defer可以将指定的语句延迟执行,用于实现资源的回收。

规则一:在函数退出时执行

需要注意,defer后的语句是在函数退出时执行,而不是类似C++中RAII那样离开块作用域执行。
下面的代码最终输出hello world

package main

import "fmt"

func main() {
	if true {
		defer fmt.Println("world")
	}

	fmt.Printf("hello ")
}

规则二:当defer被声明时,其参数就会被实时解析

下面的代码最终输出0,因为n作为参数传入的时候就已经被解析了。

package main

import "fmt"

func main() {
	n := 0
	defer fmt.Println(n)
	n++
}

规则三:defer执行顺序为先进后出

多条defer语句就会进行压栈,先声明的先执行。
下面的代码输出3 2 1 0

package main

import "fmt"

func main() {
	for i := 0; i < 4; i++ {
		defer fmt.Println(i)
	}
}

参考资料

posted @ 2022-02-21 10:09  HachikoT  阅读(191)  评论(0编辑  收藏  举报