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

例如


defer profile.Start().Stop()

等于:


p := profile.Start()

defer p.Stop()


摇曳的蔷薇
浏览 108回答 2
2回答

慕丝7291255

您可以进行一长串方法调用,但只有最后一个函数调用将被延迟,所有其他调用将立即使用该语句进行计算。deferdeferfunc 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。

收到一只叮咚

级联函数中的延迟仅延迟到最后一个函数调用。其他函数将根据评估顺序立即调用。例如func secondInteration(p *profile){    fmt.Println("~~~~~~~~~~ Second Iteration ~~~~~~~~")    defer p.start().stop()    p.intermediate()    }这只会延迟停止功能。开始和中间将作为正常执行进行评估。上面的代码段将打印~~~~~~~~~~ Second Iteration ~~~~~~~~startIntermediatestop而如果您有多个延迟函数,则这些函数将被推送到堆栈中,最后推送的延迟函数将首先被计算例如func thirdInteration(p *profile){    fmt.Println("~~~~~~~~~~ Third Iteration ~~~~~~~~")    defer p.start()    defer p.intermediate()    defer p.stop()}此输出到~~~~~~~~~~ Third Iteration ~~~~~~~~stopIntermediatestart因此,实际上,上面的代码片段在此上下文中是相同的,因为只有一个方法被链接,并且我们有一行代码。我们可以在Go博客上找到更多信息。上面的代码片段可以在这里找到
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go