go语言中defer关键字的用法

这篇文章将为大家详细讲解有关go语言中defer关键字的用法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

成都创新互联长期为成百上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为河源企业提供专业的成都网站制作、网站建设,河源网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。

在golang中,我们使用defer语句来进行一些错误处理和收尾工作,它的作用类似java里面finally关键字的作用。不过不论是java的finally关键字还是c++的Raii类,我们都能清楚地知道它们的作用域和执行的时机,那么golang中defer关键字所处理的内容是在什么时候执行的呢?

首先官方文档中说:函数返回、函数结束或者对应的goroutine发生panic的时候defer就会执行。

然后需要注意的是因为golang支持多值返回,所以是在返回前把返回值压到栈中的,而c语言是把返回值存到寄存器中返回。

golang返回时,先把返回值压栈;然后执行defer函数,如果defer函数中有修改栈中的返回值(不过不应该这样做),那么返回值会被修改;之后进行跳转返回。

这样的话我们就清楚了defer执行的时机了,即使你把defer写在返回之前很远的地方,它还是会在函数返回之前执行。

如果一个作用域中有多个defer,那么返回前的执行顺序是先执行后调用的defer,再执行早调用的defer。

官方文档里面有几个例子可以很好地说明defer的作用时机,如下:

lock(l)
defer unlock(l)  // unlocking happens before surrounding function returns

// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
    defer fmt.Print(i)
}

// f returns 1
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

关于go语言中defer关键字的用法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

网站栏目:go语言中defer关键字的用法
本文路径:https://www.cdcxhl.com/article10/pgoggo.html

成都网站建设公司_创新互联,为您提供网站策划建站公司品牌网站设计网站导航标签优化服务器托管

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设公司