golang的defer踩坑汇总

golang的defer踩坑汇总

原文链接:http://www.zhoubotong.site/post/50.html

defer语句用于延迟函数调用,每次会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行。延迟函数可以有参数:

  • 延迟函数的参数在defer语句出现时就已确定下来(传值的就是当前值)

  • return先赋值(对于命名返回值),然后执行defer,最后函数返回

  • 延迟函数执行按后进先出顺序执行

  • 延迟函数可操作主函数的变量名返回值(修改返回值)

  • defer后面的表达式可以是func或者是method的调用,如果defer的函数为nil,则会panic

日常开发中,使用不当很容易造成意外的“坑”。下面我整理了下常规使用场景下,defer的问题可能的踩坑汇总。

释放资源

defer 语句正好是在函数退出时执行的语句,所以使用 defer 能非常方便地处理资源释放、句柄关闭等问题。

package main
import (
	"fmt"
	"os"
)
func fileSize(filename string) int64 {
	f, err := os.Open(filename)
	if err != nil {
		return 0
	}
	// 延迟调用Close, 此时Close不会被调用
	defer f.Close()
	info, err := f.Stat()
	if err != nil {
		// defer机制触发, 调用Close关闭文件
		return 0
	}
	size := info.Size()
	// defer机制触发, 调用Close关闭文件
	return size
}
func main() {
	fmt.Println(fileSize("demo.txt"))
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » golang的defer踩坑汇总