成都网站建设设计

将想法与焦点和您一起共享

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"))
}

文章名称:golang的defer踩坑汇总
标题路径:http://chengdu.cdxwcx.cn/article/dsoichc.html