为了账号安全,请及时绑定邮箱和手机立即绑定

在链式方法调用中使用“defer”时会发生什么情况?

在链式方法调用中使用“defer”时会发生什么情况?

Go
摇曳的蔷薇 2022-09-12 21:01:51
例如defer profile.Start().Stop()等于:p := profile.Start()defer p.Stop()
查看完整描述

2 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

您可以进行一长串方法调用,但只有最后一个函数调用将被延迟,所有其他调用将立即使用该语句进行计算。deferdefer


func foo() {

   defer A().B().C().D().E().F().G().H()

   // Only call to H() is deferred and all other function calls must be 

   // evaluated immediately to reach H.

}

有关详细信息,请参阅有效 Go。


查看完整回答
反对 回复 2022-09-12
?
收到一只叮咚

TA贡献1821条经验 获得超5个赞

级联函数中的延迟仅延迟到最后一个函数调用。其他函数将根据评估顺序立即调用。


例如


func secondInteration(p *profile){

    fmt.Println("~~~~~~~~~~ Second Iteration ~~~~~~~~")

    defer p.start().stop()

    p.intermediate()

    

}

这只会延迟停止功能。开始和中间将作为正常执行进行评估。


上面的代码段将打印


~~~~~~~~~~ Second Iteration ~~~~~~~~

start

Intermediate

stop

而如果您有多个延迟函数,则这些函数将被推送到堆栈中,最后推送的延迟函数将首先被计算


例如


func thirdInteration(p *profile){

    fmt.Println("~~~~~~~~~~ Third Iteration ~~~~~~~~")

    defer p.start()

    defer p.intermediate()

    defer p.stop()

}

此输出到


~~~~~~~~~~ Third Iteration ~~~~~~~~

stop

Intermediate

start

因此,实际上,上面的代码片段在此上下文中是相同的,因为只有一个方法被链接,并且我们有一行代码。


我们可以在Go博客上找到更多信息。


上面的代码片段可以在这里找到


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号