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

时间:2014-02-07 17:32:27

标签: go

是否有可能defer到外部函数的末尾?

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

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

这可能吗?

// 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
}

1 个答案:

答案 0 :(得分:5)

根据规范,它可能:

  

A"推迟"语句调用一个函数,其执行延迟到周围函数返回的时刻,因为周围的函数执行了一个return语句,到达了它的函数体的末尾,或者因为相应的goroutine是恐慌。

(强调我的)

更新:除此之外,它也不是一个好主意 - Go的优势之一就是"你看到的就是你得到的东西"。将函数从内部函数推迟到外部函数将创建“隐形”函数。控制流程的变化。