Golang Defer采取行动/外部功能?

Der*_*rek 2 go

是否有可能defer结束外部功能?

// normal transaction
func dbStuff(){
    db.Begin()
    ...
    db.Commit()
}

// normal transaction w/ defer
func dbStuff(){
    db.Begin()
    defer db.Commit()
    ...
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

// can you defer to caller / outer function?
func dbStuff(){
    db.Trans()
    ...
}

// will Commit() when dbStuff() returns
func (db Db) Trans(){
    db.Begin()
    defer db.Commit() // to caller/outer function
}
Run Code Online (Sandbox Code Playgroud)

小智 9

这可能会有所帮助。

func main() {
    defer greet()() 
    fmt.Println("Some code here...")
}

func greet() func() {
    fmt.Println("Hello!")
    return func() { fmt.Println("Bye!") } // this will be deferred
}
Run Code Online (Sandbox Code Playgroud)

输出:

Hello!
Some code here...
Bye!
Run Code Online (Sandbox Code Playgroud)

参考: https: //asanchez.dev/blog/defer-golang-on-entry/


pub*_*her 5

根据规范,这是不是可能:

"defer"语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻,因为周围的函数执行了一个return语句,到达了它的函数体的末尾,或者因为相应的goroutine是恐慌.

(强调我的)

更新:除此之外,它也不是一个好主意 - Go的优点之一是"你看到的就是你得到的".将函数从内部函数推迟到外部函数将在控件流中创建"隐形"更改.